GC 定义
- 部分收集 Partial GC:目标不是完整收集整个 Java 堆的垃圾收集,又分为:
- 新生代收集 Minor GC/Young GC:目标只是新生代的垃圾收集。
- 老年代收集 Major GC/Old GC:目标只是老年代的垃圾收集。目前只有 CMS 会有单独收集老年代的行为。
- 混合收集 Mixed GC:目标是收集整个新生代以及部分老年代的垃圾收集。目前只有 G1 收集器会有这种行为。
- 整堆收集 Full GC:收集整个 Java 堆和方法区的垃圾收集。
一、分代收集理论
一般至少把 Java 堆划分为新生代和老年代两个区域。
- 绝大多数对象都是朝生夕死的。
- 熬过越多次垃圾收集过程的对象就越难以消亡。
- 跨代引用相对于铜带引用来说仅占极少数。
二、标记 - 清除算法
首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象。也可以反过来。
缺点:
- 执行效率不稳定。
标记和清除两个过程的执行效率随对象数量增长而降低。 - 内存空间的碎片化。
三、标记 - 复制算法
“半区复制”:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这块的内存用完了,就将还存活的对象复制到另外一块上,然后再已使用过的内存空间一次清理掉。
没有内存碎片问题。
缺点:
- 内存空间浪费。将可用内存缩小为原来的一半。
- 对象存活率较高时,需要进行较多的复制操作,效率降低。
四、标记 - 整理算法
标记过程与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一段移动,然后直接清理掉边界以外的内存。