GC算法
HotSpot用了分代垃圾回收器,它基于以下两个观察结果:
- 大多数已分配的对象很快变得不可达
- 从旧对象到新对象的引用很少出现
以上两个发现就是所谓的弱分代假说。
为了利用这个假设,HotSpot VM 将堆分成两个物理区域(也称为空间),称为代:
新生代
大多数新分配的对象都分配在新生代中
老年代
寿命较长的对象最终会被提升或保留到老年代
永久代
尽管它也被称为一代,但它不应该被视为代层次结构的一部分(即,用户分配的对象最终不会从老年代移动到永久代)。
标记清除算法(Mark-Sweep)
标记所有需要回收的对象,标记完成后回收被标记的对象。
或者,
标记存活的对象,回收未被标记的对象。
缺点:
- 标记清除效率随对象数量增长而降低
- 会产生大量不连续内存碎片
标记复制算法
Appel式回收:
把新生代分为一块较大的Eden空间和两块较小的Survivor空间(Eden与Survivor的比例默认为8:1)。每次分配内存只是用Eden和其中一块Survivor。发生垃圾收集时,将Eden和Survivor中存活的对象复制到另一块Survivor上,然后直接清理掉Eden和用过的那块Survivor空间。
当Survivor空间容不下一次Minor GC之后存活的对象时,这些对象会通过分配担保机制(Handle Promotion)直接进入老年代。
标记整理算法(Mark-Compact)
与标记清除类似,只是后续不是对可回收对象进行清理,而是让对象移动(像内存空间的一端移动),然后直接清理掉边界以外的内存。