分代收集算法

当前主流VM垃圾收集都采用”分代收集”(Generational Collection)算法, 这种算法会根据对象存活周期的不同将内存划分为几块, 如JVM中的 新生代、老年代、永久代,这样就可以根据各年代特点分别采用最适当的GC算法。

在新生代-复制算法

每次垃圾收集都能发现大批对象已死, 只有少量存活. 因此选用复制算法, 只需要付出少量存活对象的复制成本就可以完成收集.
优点:实现简单,回收的效率高(直接全部清空),不会出现内存碎片问题;
缺点:内存利用率低,只使用一半内存;不可回收对象越多,(复制对象)效率越低。
image.png

在老年代-标记整理算法

因为对象存活率高、没有额外空间对它进行分配担保, 就必须采用“标记—清理”或“标记—整理”算法来进行回收, 不必进行内存复制, 且直接腾出空闲内存.

标记—清理

分为标记和清除两步,
第一步:对对象进行标记;
第二步:依次把可回收的对象回收。
优点:内存利用率高;
缺点:算法分为两步执行,效率低于复制算法;GC后不进行内存碎片的整理,会产生内存碎片。
image.png

标记—整理

分为标记、整理和清除三步,
第一步:对对象进行标记;
第二步:将不可回收的对象进行整理;
第三步:清除不可回收对象内存区域以外的内存区域。
优点:内存利用率高;不会产生内存碎片;
缺点:效率比标记-清除算法还低。
image.png

分区收集算法

分区算法则将整个堆空间划分为连续的不同小区间, 每个小区间独立使用, 独立回收. 这样做的好处是可以控制一次回收多少个小区间 , 根据目标停顿时间, 每次合理地回收若干个小区间(而不是整个堆), 从而减少一次GC所产生的停顿。
JVM内存区域