1. 分代收集理论

收集器应该将Java堆划分 出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。

  • 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。
  • 强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡。
    file

2. 部分收集(Partial GC)

  • 指目标不是完整收集整个 Java 堆的垃圾收集

新生代收集(Minor GC/Young GC)

  • 指目标只是新生代的垃圾收集。
    file

    老年代收集(Major GC/Old GC)

  • 指目标只是老年代的垃圾收集。目前只有 CMS 收集器会有单独收集老年代的行为.

混合收集(mixed GC)

  • 指目标是收集整个新生代以及部分老年代的垃圾收集。G1收集器会有这种行为.

3. 整堆收集(Full GC)

收集整个 Java 堆和方法区的垃圾收集.

4. 分代收集缺点

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

3)跨代引用假说:跨代引用相对于同代引用来说仅占极少数

存在互相引用关系的两个对象,是应该倾向于同时生存或者同时消亡的。

依据这条假说,我们就不应再为了少量的跨代引用去扫描整个老年代,也不必浪费空间专门记录每一个对象是否存在及存在哪些跨代引用,只需在新生代上建立一个全局的数据结构(该结构被称 为“记忆集”,Remembered Set),这个结构把老年代划分成若干小块,标识出老年代的哪一块内存会存在跨代引用。此后当发生Minor GC时,只有包含了跨代引用的小块内存里的对象才会被加入到GC Roots进行扫描.