JVM学习笔记12

46 阅读2分钟

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)

与标记清除类似,只是后续不是对可回收对象进行清理,而是让对象移动(像内存空间的一端移动),然后直接清理掉边界以外的内存。