3.
对堆划分区域,将回收对象依据其年龄分配到不同的区域
这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:收集器应该将Java堆划分
出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同
的区域之中存储。
如果一个区域中大多数对象都是朝生夕灭,难以熬过垃圾收集过程的话,那么把它们集中放在一
起,每次回收时只关注如何保留少量存活而不是去标记那些大量将要被回收的对象,就能以较低
代价回收到大量的空间。
如果剩下的都是难以消亡的对象,那把它们集中放在一块,虚拟机便可以使用较低的频率来回收
这个区域,这就同时兼顾了垃圾收集的时间开销和内存的空间有效利用。
堆划分
所以堆分为为新生代(Young Generation)和老年代(Old Generation)两个区域。
在新生代中,每次垃圾收集时都发现有大批对象死去,剩下的逐步放到老年代。
跨代引用
新生代中的对象是完全有可能被老年代所引用的,为了找出该区域中的存活对象,不得不在固定
的GC Roots之外,再额外遍历整个老年代中所有对象来确保可达性分析结果的正确性,反过来也是
一样。这样无疑会为内存回收带来很大的性能负担。
解决理论
跨代引用假说(Intergenerational Reference Hypothesis):跨代引用相对于同代引用来说仅
占极少数。
存在互相引用关系的两个对象,是应该倾向于同时生存或者同时消亡的。
存在互相引用的两个对象应该同时生存或者同时消亡。所以存在跨代引用的新生代对象会因为老
年代对象难以消亡,也 得意存活 , 最后也晋升到老年代, 跨代引用被消除。
记忆集
在新生代建立一个记忆集, 将老年代标识为一小块的区域,标识哪些区域存在跨代引用。当发生
MinorGC时,扫描GC Roots + 记忆集中 存在 跨代引用的老年代区域对象作为GC 也作为GC Roots
进行扫描。
虽然这种方法需要在对象改变引用关系(如将自己或者某个属性赋值)时维护记录数据的正确
性,会增加一些运行时的开销,但比起收集时扫描整个老年代来说仍然是划算的。
垃圾回收分类
1. 部分收集(Partial GC)
1.1 新生代收集(Minor GC/Young GC):
评论0
最新资源