针对 HotSpot VM 的实现,它⾥⾯的 GC 其实准确分类只有两⼤种:
- 部分收集 (Partial GC):目标不是完整的收集整个Java堆的收集。
- 新⽣代收集(Minor GC / Young GC):只对新⽣代进⾏垃圾收集;
- ⽼年代收集(Major GC / Old GC):只对⽼年代进⾏垃圾收集。需要注意的是 Major GC 在 有的语境中也⽤于指代整堆收集;
- 混合收集(Mixed GC):对整个新⽣代和部分⽼年代进⾏垃圾收集。
- 整堆收集 (Full GC):收集整个 Java 堆和⽅法区。
垃圾回收算法
- 标记-清除算法
- ⾸先标记出所有需要回收的对象,在标记完成后统⼀回收掉所有被标记的对象,也可以反过来,标记存活对象,统一回收所有未被标记对象。
主要优缺点:
- 执行效率不稳定:如果Java堆中包含大量对象,而且其中大部分是需要回收的,这时必须进行大量的标记和清除动作,导致标记和清除两个过程的执行效率随着对象数量的增加而降低;
- 内存空间碎片化问题:标记清除后会产生大量不连续内存碎片,空间碎片太多可能会导致以后程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
- 标记-复制算法
- 它可以将内存分为⼤⼩相同的两块,每次使⽤其中 的⼀块。当这⼀块的内存使⽤完后,就将还存活的对象复制到另⼀块上面去,然后再把使⽤的空间⼀ 次清理掉。这样就使每次的内存回收都是对内存区间的⼀半进⾏回收。如果内存中多数对象都是存活的,这种算法将会产生大量的内存间复制开销
- 标记-整理算法
- 标记过程仍然与“标记-清除”算法⼀样,但后续步骤不是 直接对可回收对象回收,⽽是让所有存活的对象向⼀端移动,然后直接清理掉端边界以外的内存。