【技术小说连载】我在JVM公司的那些年(十)——不一样的垃圾回收

【技术小说连载】我在JVM公司的那些年(十)——不一样的垃圾回收

小说连载系列是我第一次尝试的新的技术讲解方式,希望通过小说的形式将技术细节讲解清楚。

第一篇中长篇连载小说《我在JVM公司的那些年》,主要讲解JVM内部的一些原理,希望大家能够喜欢,多多支持。

郑重声明:小说人物和故事情节均是原创,未经同意禁止任何形式的转载,侵权将进入法律程序。大佬除外。

欢迎大家转发文章,谢谢!


本节知识点预告:老年代垃圾回收。

大家好,我叫小史,是一个非科班程序员……哦,不,在这部小说中,我是一个java对象。

前情回顾:

接受了公司潜规则,我在老年代也兢兢业业地工作起来。

老年代不愧是老年代,已经快一个月了,这里一次垃圾回收都没有发生,新生代都已经发生好几次垃圾回收了。

这对于公司来说,其实是有利的,垃圾回收的次数越少,我们工作时被打扰的次数就越少,就越能高效率地工作

只是每一次新生代垃圾回收,都有几个同事进入老年代,慢慢的,老年代的工位也越来越紧张,已经快坐不下了。

垃圾回收

该来的还是来了。这天,我正在奋力运行代码,突然一队穿着警服的人闯进了老年代,我们立刻停下了手中的活。

队尾慢慢走来一个人,身穿一身警服,却是一副凶神恶煞的样子,他也是垃圾回收器。

原来老年代的垃圾回收器和新生代的垃圾回收器不是同一个人啊

垃圾回收器开口说话了:“可能有些人还不认识我,自我介绍一下,我是垃圾回收器,负责老年代的垃圾回收工作,请大家配合一下。”

相比于新生代温文尔雅却冷酷的垃圾回收器来说,这位表面上凶神恶煞的垃圾回收器倒是更有礼貌,果然是人不可貌相。

垃圾回收器话音刚落,警队的人就冲了上来。但是与新生代直接把人带走不同的是,警队的人并没有一上来就把人带走,而是对大家进行标记,给在GCRoot引用链中的人做了一个记号

【技术小说连载】我在JVM公司的那些年(十)——不一样的垃圾回收

记号做完之后,又来第二轮,直接对大家进行工位调整,让有记号的同事们从老年代区第一个工位开始依次排列。排好之后,把剩下的工位直接清空了。这次大概清理了6.25%的工位。

【技术小说连载】我在JVM公司的那些年(十)——不一样的垃圾回收

整个过程比新生代垃圾回收慢了很多

我的工位也进行了调整,并且调整完之后,我和师兄坐在了一起。

讨论

垃圾回收器走了之后,我问师兄:“师兄,这老年代的垃圾回收和新生代完全不一样啊?”

师兄:“是的,老年代的这个垃圾回收算法叫做标记-整理算法。”

我一听有点耳熟:“我记得新生代一开始用的是标记-清除算法。”

师兄:“对的,但是标记-清除算法不是有一个致命的缺点么?”

我:“是的,我记得标记-清除算法会产生工位碎片,这将导致一些稍大一点的团队无法分配到连续的工位,必须分开坐。”

师兄:“没错,所以老年代的标记-整理算法在标记-清除算法上进行了改进,把大家的工位进行整理,把空余的工位归拢在一起,避免了工位碎片。”

我:“哦,原来如此,不过我还有一个问题啊,为什么老年代不像新生代一样,用复制算法呢?”

师兄:“这个问题问得好,这和这两个区的特点有关。新生代的特点是回收率高,一次回收之后,剩下的员工很少了,所以让他们迁移工位,把他们复制到另一个survior区,成本很小。但是老年代……

我瞬间明白了:“老年代回收率低,如果采用复制算法,那么有很多员工需要复制,survior区也需要设置得很大,反而得不偿失了。”

师兄:“哈哈,说得没错,而且你要注意,因为新生代有两个survior区,它们是交替使用,所以其实survior区总体使用率只有50%。”

我:“哦,这也是复制算法的缺点之一呀。”

方法区

师兄:“对了,明天上班别迟到。明天方法区的人会过来和我们进行交流。”

方法区?就是有资格做GCRoot的人所在的区?哈哈,早就想会会他们了。

我:“没问题,明天我一定早来。”

(未完待续……)


小史已经挺过了老年代的垃圾回收,马上要会见方法区的大佬了,方法区的人和新生代老年代的人有什么区别?欲知后事如何,请听下回分解。

小结

老年代的垃圾回收采用标记-整理算法,之所以这样是因为老年代的回收率并不高,所以只需要将少量未被标记的对象清理就好,而为了防止内存碎片的产生,会对内存中的对象再进行一次整理,这种方法也有缺点,就是很慢。

下节知识点预告:方法区


第一次尝试写技术小说,如果你喜欢这种形式,麻烦动动手指转发一下,你不经意间的动作,可能就会给大家带来一部伟大的技术小说。

【技术小说连载】我在JVM公司的那些年(十)——不一样的垃圾回收