zhaoyu@home:~$

jvm-垃圾回收算法

标记-清除(Mark-Sweep)

如字面:先标记需要清楚的对象,标记完后统一回收。

不足:

1,效率都不高,2产生大量内存碎片,导致以后分配较大对象时,不得不提前出发另一次回收。

复制算法(copying)

将内存分为大小相同的两块,只使用一块,当这一块使用完后,就将存活的对象复制到另一块上。不用考虑内存碎片等情况。实现简单,运行高效。

不足:

缩小内存为代价。

现在的商业虚拟机用这种算法来回收新生代,新生代98%的对象都是“朝生夕死”,所以并不需要按1:1来分配内存空间,将内存分为一个较大的Eden区和两个 较小的Survivor区,默认Eden大小是Survivor的若干倍。每次使用Eden和一块Survivor。最后清理掉Eden和刚才用过的Survivor,将存留的对象赋值到 另一个Survivor。如果另一个Survivor不够用,则需要老年代进行分配担保。

标记整理(Mark-Compact)

和标记清除类似,只是将清除改成整理,将存活的对象向一端转移,直接清理掉边界以外的内存。这样就会得出连续的空白大空间。一般老年代比较适合这种算法。