我在JVM公司的那些年(十)— 不一样的垃圾回收 - 知乎

作者:channingbreeze

出自:微信公众号“互联网侦查”

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

    • *

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

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

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

    • *

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

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

前情回顾:

java钢铁侠-马克51号:【小说连载】我在JVM公司的那些年(九)——潜规则​zhuanlan.zhihu.com图标java钢铁侠-马克51号:【技术小说连载】我在JVM公司的那些年(八)——死里逃生​zhuanlan.zhihu.com图标java钢铁侠-马克51号:【技术小说连载】我在JVM公司的那些年(七)——玉石俱焚​zhuanlan.zhihu.com图标java钢铁侠-马克51号:【技术小说连载】我在JVM公司的那些年(六)——智斗黑老大​zhuanlan.zhihu.com图标java钢铁侠-马克51号:【技术小说连载】我在JVM公司的那些年(五)——主动出击​zhuanlan.zhihu.com图标java钢铁侠-马克51号:【技术小说连载】我在JVM公司的那些年(四)——工位调整​zhuanlan.zhihu.com图标java钢铁侠-马克51号:【技术小说连载】我在JVM公司的那些年(三)——恐怖的垃圾回收​zhuanlan.zhihu.com图标java钢铁侠-马克51号:【技术小说连载】我在JVM公司的那些年(二)——残酷的制度​zhuanlan.zhihu.com图标java钢铁侠-马克51号:【技术小说连载】我在JVM公司的那些年(一)——奇怪的面试​zhuanlan.zhihu.com图标

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

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

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

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

垃圾回收

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

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

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

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

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

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

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

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

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

讨论

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

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

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

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

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

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

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

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

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

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

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

方法区

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

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

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

(未完待续……)

    • *

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

小结

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

下节知识点预告:方法区

    • *

Java系列教程资源(电子书、Java面经、视频教程等等)

Java基础、入门、精通、架构师全套资源​shimo.im图标


Original url: Access
Created at: 2019-09-04 16:46:22
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论