在深入理解垃圾回收思想的时候,也要了解一下分代收集理论。
分代收集理论
这个理论主要是建立在两个分代假说之上的:
- 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。
- 强分代假说(Stong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以死亡。
这两个部分共同奠定了后面很多的垃圾收集器的基本设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据年龄分配到不同的区域进行存储,针对不同的区域,又进行不同的垃圾收集。
但在最后也还出现了一个问题,在进行一次只限于新生代区域的收集(Minor GC),但新生代中的对象完全有可能被老年代所引用的,为了找出该区域中的存活对象,就不得不在固定的GC Roots之外,再额外遍历整个老年代所有对象来确保可达性结果的正确性,反过来也是一样的。这种在理论上是可行的,但实际上会对内存回收带来很大的性能负担。
所以就有了第三条经验法则:
- 跨代引用假说(Intergenerational Reference Hypothesis):跨代引用相对于同代引用来说仅占极少数。
存在互相引用关系的两个对象,是一个倾向于同时生存或者同时消亡的。
依据这条假说,我们就不再为了少量的跨代引用去扫描整个老年代,也不必浪费空间专门记录每一个对象是否存在哪些跨代引用,只需要在新生代上建立一个全局的数据结构(记忆集),这个结构把老年代划分为若