参考:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) 周志明 著
一般至少会把Java
堆划分为 新生代(Young Generation
) 和 老年代(Old Generation
) 两个区域。
在新生代中,每次垃圾收集时都发现有大批对象死去,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放。
在新生代用 标记-复制算法,在老年代用 标记-清理算法 或 标记-整理算法。
几个概念:
Minor GC/Young GC
):指目标只是新生代的垃圾收集。Major GC/Old GC
):指目标只是老年代的垃圾收集。目前只有CMS
收集器会有单独收集老年代的行为。另外请注意“Major GC
”这个说法现在有点混淆,在不同资料上常有不同所指,读者需按上下文区分到底是指老年代的收集还是整堆收集。Mixed GC
):指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有G1
收集器会有这种行为。Full GC
):收集整个Java
堆和方法区的垃圾收集。首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象。
缺点:
将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
在HotSpot
里,考虑到大部分对象存活时间很短,将内存分为Eden
和两块Survivor
,默认比例为8:1:1
。代价是存在部分内存空间浪费,且可能存在空间不够需要 分配担保 的情况,所以 适用于新生代。
缺点:
首先标记出所有需要回收的对象,然后让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
适用于老年代。
缺点: