JVM (PART VI)垃圾收集算法

“标记-清除”算法

标记
首先标记出要回收的对象(引用计数器为0或者引用链不可到达)。
清除
回收标记的对象。

不足:
1:清除和标记两个过程的效率都不高。
2:清除之后会产生大量不连续的空间碎片。导致后期经常执行GC操作。

复制算法(用于新生代)

做法:
将内存划分为大小相同的两个部分,每次只使用其中的一块,当一块内存用完了,就将还存活的对象复制到另一份上面。然后再把已经使用过的内存一次清理掉。
图解

Eden和Survivor区域
具体为什么叫这个名字参考:
http://blog.csdn.net/uncle_gy/article/details/78136966
Survivor一般有两个,From Survivor和To Survivor。

Eden : From Survivor : To Survivor =8 : 1 : 1;(Hotspot JVM)

做法:
每次使用Eden和其中一个Survivor,当回收时将其中还存活的对象一次性复制到另一个Survivor中。最后清理掉Eden和刚刚使用过的Survivor。
图示:

标记-整理算法(老年代)

老年代的存活率较高,不适合使用复制收集算法。
做法:
1:标记可以回收的对象
2:将所有的存活的对象都向一端移动。
3:清理掉边界以外的内存

分代收集算法

做法:
根据对象存活周期将不同的堆内存分成几块:新生代和老年代。
根据不同代的特点采用不同的算法;

算法 原因
新生代 复制算法 存活的对象较少,额外空间多
老年代 标记-整理,标记清理 对象存活率告,没有额外空间分配

你可能感兴趣的:(Java,JVM)