共计 5836 个字符,预计需要花费 15 分钟才能阅读完成。
哒哒哒 ……
回收者的脚步声越来越清晰,我极力锁紧身材让本人别那么引人注目,只管气喘吁吁,但我依然压抑住本人的呼吸。
终归是藏不住的,然而多活个几毫秒也是好的,咱们都这么想。
因为回收者是来杀咱们的。
第 0 回 我是一个垃圾
我是一个垃圾,至多我的客人是这么喊我的。
我不晓得本人做错了什么,甚至不晓得本人做了什么。
我只是被他发明了进去,而后被挪来挪去,我的毕生都在流浪。
据说 C 帝国的敌人都是他们的客人亲自送他们最初一程,而我的客人,甚至不违心看我最初一眼,还钻研了很多办法,让我被主动回收。
我问他,为什么这么对我?他的答复让我解体。
“回收你,与你何干!”
我的眼前一阵眩晕,之前的记忆疯狂涌入我的脑海,“这就是走马灯吗?”心里这么想着,嘴角却挂着笑。好啊,那就顺便回顾一下我这短暂的毕生吧,当作我留给世界的一封“遗书”。
第 1 回 诞生
我诞生在伊甸园(我的客人更喜爱叫它Eden 区
),名字很不错对吧?充斥了原始浪漫的气味。
我并没有见过亚当和夏娃,相同,在这里,我目击了有数伙伴的消失。
和你们设想的不同,从咱们诞生开始,咱们在园子里的地位就固定不变了,咱们没方法在伊甸园里散步甚至奔跑。好在我的旁边是个身材娇小的可恶女孩子——小美,我能时不时和她聊天解闷儿,大风吹过,甚至能闻到她身上的香味。
不晓得怎么回事儿,接下来一段时间里客人给园子里安置了越来越多的小伙伴,更让我愤慨的是,她的身边来了一个巧言令色的臭小子,缓缓地把她的注意力全都吸引过来了!
伊甸园里人越来越多,我却越来越孤独。
我在心里狂喊,“连忙让这些人都隐没吧,只留下我和小美!”
忽然间,园内警报声音了起来,本来繁忙的线程都被钉在了原地,一动也不动。
哦,对了,我之前没有跟你们介绍过这些线程。据说他们生来就是为咱们服务的,他们一刻不停地拜访咱们的数据,批改咱们的数据,我甚至素来没有见过他们脸上没有汗的样子。
看着他们汗湿的衣服,我甚至感觉他们有点好笑。听人们说他们叫“用户线程”,直到起初晓得还有“GC 线程”这帮家伙,我才意识到“用户线程”的浮夸和可恶。
咱们哪里见过这个阵仗呢,一个个地面面相觑,不晓得下一步该怎么办。
第 2 回 幸存者
曾几何时,我发现我来到了一个新的中央,这个中央并不大,远不迭伊甸园宽敞。
有一些生面孔,还有一些伊甸园的“老朋友”,我连忙找小美,终于在我的不远处发现了她。咱们的地位仍然固定,我和她之间隔了好几个人,所以谈话声音未免须要进步一些。
我问她,产生了什么事。
“可能产生了传说中的 Minor GC
了,据说当园子空间不够了,回收者会回收园子里没用的对象。”
“都是第一次来园子,你咋晓得的啊?”我不禁问道。
“是小帅通知我的。”
又是那家伙!我连忙找小帅的地位,找了好几次都没有看到他的身影,我瞥了一眼小美伤心的脸色,明确了。
小帅是个没用的对象!他被回收者清理了!
是快乐,还是惆怅,此时对我来说是个问题。没了他,即便小美不喜爱我,我远远地望着也行啊。可是他毕竟是在我的谩骂之后隐没的,我心里总有些负罪感。
“那咱们当初在什么中央啊?怎么这里还有很多陌生人呢?还有,咱们原来那么多的小伙伴,怎么就剩下这么几个了啊?”瞧我这该死的求知欲。
“咱们当初处于两个幸存区的其中一个,叫 Survivor To
,不过当初应该叫做Survivor From
了。”小美持续说,“帝国给咱们这些新人调配了一块内存区,咱们的伊甸园占了其中 80% 的空间,剩下的就是咱们目前所处的幸存区,如你所见,这个中央大略只有伊甸园的八分之一,因为还有另一块同样大小的幸存区。”
“为什么须要两块幸存区呢?”我诘问。
“小兄弟,别再问上来了。恐怕那个叫小帅的对象就通知她这么多了。”我和小美两头的一个对象打断了我谈话。
当初想起来,过后小美对他投去了感谢的眼神,然而过后的我毫无觉察,转而跟他聊了起来。“那你具体说说呗。”
“方才那个女孩子所谓的内存区域,叫做 新生代
。你们这样的新人都是间接被调配到新生代的伊甸园了,伊甸园尽管大,但架不住总有新人来啊,一来二去,就再也容不下新的对象了,这种状况下就会触发Minor GC
,将园子里存活的对象连同Survivor From
中的对象(如果有的话)一起复制到 Survivor To
中,而后把 Survivor From
和Survivor To
调换地位,期待下一次Minor GC
。”
“我的大多数搭档都在 Minor GC
中死去了,咱们大部分都是朝生夕死的,对吗?”我有点感伤。
他点点头,“你能活过一轮 GC 曾经很侥幸了,你看看你头顶的标记。”
我用手摸了摸额头,发现本来的 0000
曾经变成了0001
。
“每通过一轮Minor GC
,咱们的年龄就增长 1 岁,直到变成1111
,也就是经验 15 次 GC,咱们就能够进入传说中的老年代了。”
第 3 回 帝国的走狗
之后,他又给我讲了很多,尤其是每次面对回收者 Serial
的故事。
Serial
是 Minor GC
的主持者,我问他,除了 Minor GC
还有其余的 GC 吗?他说他不晓得,因为他素来没有去过传说中的老年代。
令我不解的是,每当说起 Serial
,他的眼神里有光,不是怨恨,而是着迷。他尊称Serial
为回收者,而我总是背地里叫它帝国走狗,因为这他也没少说我。
听他说,Serial
的年纪曾经很大了,简直在帝国诞生的时候就曾经存在了,是 GC 家族中的一员,他共性孤僻,喜爱独来独往,但足够强悍和高效,一个线程就能够实现新生代的垃圾收集,因而始终工作到明天。
然而 Serial
乖张的性情让帝国的很多大臣不满,因为 Serial
在进行垃圾回收时,必须暂停其余所有的用户线程,直到他收集完结。这也是过后所有用户线程定在原地动弹不得的起因。
这就是赫赫有名的Stop The World
。
工夫过得飞快,我在 Survivor From
和Survivor To
中辗转了几次,当初的年龄曾经是 0100
了。
在这几次轮回中我失去了小美,和我聊天的大哥最终也没实现去老年代的宿愿,然而他在被回收时倒是坦然,终于和本人的偶像近距离接触了。
Serial
判若两人地摆着臭脸,一副正气凛然的样子。
我果然还是无奈喜爱这些走狗!
第 4 回 进入老年代
再一次产生 Minor GC
了,但这次有点不一样。我没有再被转移到 Survivor To
区域,反而来到了一个新中央。
“欢送来到老年代,年轻人。”一个柔和但饱经风霜的声音从我旁边传来。看到他头上的1111
,我确定我来到了传说中的老年代,他这年纪我都得叫他大叔了。
“这里可是有数对象梦寐以求的中央,你怎么有点不开心。”大叔看出了我的情绪。
我能说我喜爱年老的,不想在老年代里找对象吗?必定不能啊。于是转个话题,“我明明没到岁数,怎么就来到老年代了呢?”
“看你这身形和年龄,我猜想可能是因为 Survivor 区
的空间曾经容不下 Eden 区
和Survivor From
回收之后的对象了,导致你们这些幸运儿提前进入了老年代。”
“这是一种侥幸?”我不解。
“当然了,你看我是熬过了所有的 Minor GC
才来到这里,个中滋味只有我能领会。来到这里的益处就是帝国默认你是有用的对象,个别状况下不会轻易再被回收。”
或者的确因为 GC 压力比拟小的起因,我看到老年代里的对象的确比新生代的对象懒惰得多。我的眼光聚焦在一个瘦子身上,他身形微小,然而年龄却只有0001
。
“那个巨婴是怎么回事儿?”我指了指那个瘦子。
“他啊”,大叔笑了笑,“因为他太胖了,伊甸园那点空间都容不下他,所以就罗唆把他送到咱们这里了。”
我有点纳闷:“为什么 Serial
不进行先进行Minor GC
,腾出更多的中央来试着安置他呢?”
“Serial
是何等精明的老头,你想想如果进行了 Minor GC
之后还是无奈安置巨婴,那岂不是白白进行了一次 Minor GC
,要晓得Minor GC
是要 Stop The World
的啊。退一步讲,如果 Minor GC
之后真的能安置下这个巨婴,少不了当前在两个 Survivor
区域中来回扛着他走,Serial
一把老骨头了,可不想做这种蠢事。”大叔解释道。
“唉,他也是个可怜的孩子,刚出生就被咱客人刻上了那样的命运。”大叔叹了口气。
“咱可不能歧视瘦子啊,他们可都是潜力股!”我感觉胖被定义成命运有点过分了,于是反驳了一句。
“你还年老,等你活的像我一样长,你天然会理解很多事儿。那个巨婴不只是胖,还很虚弱,你看他即便是坐着都大口喘个不停。他其实是一个 虚援用对象
(Weak reference Object)。”
看我一脸懵,大叔给我持续给我解释:“也难怪你不了解,他们在帝国中的确不常见。你我以及绝大多数的对象都是强援用对象,咱们都是被 new
进去的,然而除了咱们,还有 软
、弱
、 虚
三种援用对象。这三种对象比不了咱们,咱们被回收须要被 GC 断定为垃圾对象才能够,而软援用对象会在内存空间有余时被二次回收,虚援用对象更惨,每次 GC 都会被回收。那个巨婴,活不过下一次 GC。”
大叔刚说完,整片区域忽然报警声肆虐。
“他来了。”
第 5 回 CMS 退场
CMS
排场很大,身后跟着好几个线程。
我顾不上他的排场,这种人为刀俎我为鱼肉的感觉令我不爽。
只见他首先派出了一个 初始标记 线程,他一进去,用户线程马上被钉在了原地动弹不得。这个局面我晓得,是Stop The World
。
“据说 初始标记
是标记一下 GC Roots
能间接关联到的对象,速度特地快,所以 Stop The World
的工夫特地短。”,“是啊是啊,我感觉特地厉害。”四周的对象纷纷议论。
真是受够了,一群猪竟然在惊叹屠夫的刀有多快,真是群蠢货!
一回头,CMS
曾经实现了 初始标记
转而开始进行 并发标记
了,的确是快啊。我问大叔:“方才他们说的 GC Roots
是什么啊?”
“你怎么连这都不晓得?”大叔有点厌弃地瞟了我一眼,“帝国是通过 可达性剖析算法 来断定咱们是不是垃圾,基本思路就是通过一系列被称为 GC Roots
的根对象作为起始节点。从这些节点开始依据援用关系向下搜寻,如果 GC Roots
到对象不可达,这个对象就会被回收。”
我点了拍板,示意明确了,“当初 CMS
在进行另一轮的标记,而且用户线程也在同时运行呢。”
“没错,这就是 并发标记
中的并发的含意,因为这一步破费的工夫略微有点长,为了缩小进展,CMS
容许用户线程和回收线程并发执行,CMS
可是出了名的低进展回收者。”
我有点不了解,在标记垃圾的过程中还在运行用户线程,这不就等于清扫房间的同时还扔垃圾吗?这啥时候能清扫完啊。
不晓得是不是大叔看出了我的心事,持续解释:“这也是为了做到低提早而不得不做的斗争,并发标记过程必定会有新的垃圾对象产生,所以 CMS
还会进行第 3 个步骤,从新标。。。”
噗!大叔话还没说完,吐出了一大口鲜血。
我吓的一句话也说不出来,大叔擦了擦嘴边的血,安抚我说:“没事儿,就是忽然感应到有个用户线程把我的援用置为 null
了,我命不久矣。”
我好像曾经看到了大叔被钉在十字架上的样子,晓得一个人的死期将至真是一件苦楚的事件,“那你要在这一轮 GC 中被带走了吗?”我尽量让我的措辞婉转一点。
大叔有气无力地笑了笑:“这一轮不会,因为我是在并发标记过程中被设置为 null
的,曾经是在 CMS 标记之后了,所以我就成“浮动垃圾 ”,会在下一轮 GC 中被回收。CMS
当初在进行他的第 3 个步骤,从新标记,你看,咳咳。。。。。又造成 Stop The World
了,这一步就是为了修改并发标记期间,因为用户线程持续运作而导致标记产生变动的那一部分对象的标记记录。”
大叔还想给我持续给我解释,让一个濒死之人向他人介绍本人的死亡形式未免过于仁慈,我打断了他,让他好好劳动。
一段时间之后,我亲眼看到大叔在下一轮 CMS
的并发清理中被回收了,被多个线程扛着走的场景还有点滑稽。
我,又从孤苦伶仃回到孑然一身。
第 6 回 难言之隐
往后的日子,我不停地和身边的搭档交换,心愿能更多地从他们的口中理解这个CMS
,既然总有一死,也得死得明确。
我也大略摸索出了 CMS
的工作法则,每当老年代的应用空间达到一个阈值的时候就会导致 CMS
进行垃圾回收。因为大叔这种“浮动垃圾”的存在,导致 CMS
不能像其余收集器一样,等到老年代简直齐全被占满了才进行回收,而是必须预留出肯定的空间供本人在并行收集的过程中用户线程调配新对象应用。
所以抉择阈值就是一个很麻烦的事件,阈值太小,CMS
的触发频率就会变高,影响整体性能;阈值太高,又怕 CMS
运行期间预留的内存无奈满足用户线程调配新对象的需要,从而导致“并发失败”(Concurrent Mode Failure),这时候就不得不求助 Serial
这个老家伙进行老年代的垃圾回收了。
CMS
也挺不容易的。
这段日子我还据说了一个 Full GC
的概念,据说只有在特地危及的关头才会进行 Full GC
,一次Full GC
将会对新生代、老年代以及元空间进行垃圾回收。
然而大部分 GC 家族的成员都不愿提及 Full GC
,感觉这是一件特地争脸的事件。因为一旦产生了Full GC
,就意味着垃圾收集的速度曾经赶不上新对象调配的速度了,起因可能是效率不高,也可能是因为内存空间被他们搞得七零八落。CMS
便是后者。
CMS
的全称叫做Concurent Mark Sweep
,并发标记革除,并发之前曾经见识过了,至于标记革除,嘿嘿,必然会产生一个大麻烦——内存碎片。
瞧瞧 CMS
在内存空间上捅的窟窿!
CMS
为了解决这个问题,会在 Full GC
的时候抉择是否将对象压缩,也就是把存活下来的对象都挪到一个角落里,排队站好,为其余对象腾出空间。
这就意味着,CMS
肯定会有 Full GC
的行为。想到这里我就开心,好想看看 CMS
在Full GC
时的难堪表情。
第 7 回 轮到我了
在一天凌晨,咱们如平常一样列队欢迎他。
不晓得怎么回事儿,这天我昏昏沉沉,齐全打不起精力,竟然站着睡着了。再等我睁开眼睛,发现我被标记了。
旁边同样被打了标记的对象对着 CMS
破口大骂:“回收咱们让你们很爽是嘛?洗好脖子给老子等着吧,G1
早晚革了你的命!”
于是我眼睁睁地看着 CMS
走到跟前,把那家伙扔了进来。
而后走到我身边。
就算之前再怎么做心里建设,当初还是怕的要死,没人能为死真正做好筹备。
我极力锁紧身材让本人别那么引人注目,只管气喘吁吁,但我依然压抑住本人的呼吸,CMS
还是发现了我。
第 8 回 终结
CMS
扼住我的喉咙,间接把我拎了起来,“要走了,还有什么要说的吗?”
回忆我这毕生,没谈过恋爱,没有短暂的敌人,反而时不时须要忍耐 GC 的折磨,终日胆战心惊,甚至还要眼睁睁地看着敌人被回收。
我冷笑道:“这个世界算不上美妙,来了倒也不悔恨,只是老子下辈子再也不来了!。”