一些收藏

《深入理解JVM虚拟机》读书笔记-虚拟机垃圾收集算法

2021-10-22  本文已影响0人  乙腾

虚拟机垃圾收集算法

本章节介绍

   垃圾收集算法的实现涉及大量的程序细节,且各个平台的虚拟机操作内存的方法都有差异,在本节中我们暂不过多讨论算法实现,只重点介绍分代收集理论和几种算法思想及其发展过程。

   从如何判定对象消亡的角度出发,垃圾收集算法可以划分为:

  由于引用计数式垃圾收集算法在主流Java虚拟机中均未涉及,所以我们暂不把它作为正文主要内容来讲解,本节介绍的所有算法均属于追踪式垃圾收集的范畴。

分代收集理论

强、弱分代假说

  当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(Generational Collection)的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则</font>,它建立在两个分代假说之上:

依据两个假说提供了多款垃圾收集器的一致性设计原则

这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:

依据分代设计原则,产生的效应

  在Java堆划分出不同的区域之后,垃圾收集器才可以每次只回收其中某一个或者某些部分的区域

分代设计原则在商用虚拟机中的体现

把分代收集理论具体放到现在的商用Java虚拟机里,设计者一般至少会把Java堆划分为

跨代引用假说(Intergenerational Reference Hypothesis)

产生背景

  假如要现在进行一次只局限于新生代区域内的收集(Minor GC),但新生代中的对象是完全有可能被老年代所引用的,为了找出该区域中的存活对象,不得不在固定的GC Roots之外,再额外遍历整个老年代中所有对象来确保可达性分析结果的正确性,反过来也是一样。遍历整个老年代所有对象的方案虽然理论上可行,但无疑会为内存回收带来很大的性能负担。

  为了解决这个问题,就需要对分代收集理论添加第三条经验法则:

产生推理

  这其实是可根据前两条假说逻辑推理得出的隐含推论:存在互相引用关系的两个对象,是应该倾向于同时生存或者同时消亡的。

  举个例子,如果某个新生代对象存在跨代引用,由于老年代对象难以消亡,该引用会使得新生代对象在收集时同样得以存活,进而在年龄增长之后晋升到老年代中,这时跨代引用也随即被消除了。

跨代价说提出后的效应

知识补充

针对不同分代的名词

上一篇下一篇

猜你喜欢

热点阅读