JVM虚拟机 垃圾回收算法

标记-清除算法

标记所有要回收的对象,然后统一回收。
不足:1.标记和清除的效率都不高。
2.会产生大量不连续的碎片。
3.在碎片中无法找到足够的连续内存又会触发垃圾回收。
JVM虚拟机 垃圾回收算法

复制算法

将内存分为两块,每次只使用其中一块。当这一块用完了,将所有存活对象复制到另一块上,然后将这一块的内存全部清理掉。
缺点:分为两半是在是太多了。因为很多对象刚刚被引用就死了,所以1:1不明智。浪费了50%的内存。

JVM虚拟机 垃圾回收算法

标记-整理算法

标记所有要回收的对象。然后把所有存活对象复制到内存的一端(覆盖掉要回收的对象)。然后把边界以外的内存全部清除。
JVM虚拟机 垃圾回收算法

分代回收

主流算法。复制算法的升级。

将对象分为新生代,老年代和永久代。
新生代是新生的对象,很多刚出生就死了的对象。
老年代是存活得比较久,但还是可能死的对象。
永久代是一般不死的。

将内存分为原始区(eden),两个生存区(survivor from和survivor to),一个老年区和一个永久区。
原始区:存放刚刚新生的新生代。经历垃圾回收动作存活下来的进入生存区。
生存区:存放活过一段时间的新生代,他们每经历过一次垃圾回收动作存活下来后就会去另一个生存区。生存了很多次以后就会进入老年区。
老年区:存放活了很久的对象
永久区:存放如类加载信息等一般不死的对象的区域。