您的位置:首页 > 编程语言 > Java开发

初识Java虚拟机(4)垃圾回收算法

2017-01-22 15:44 190 查看
标记-清除算法
首先标记处所有需要回收的对象,标记完成后统一回收所有被标记的对象。该方法的主要不足有两个,一是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后的程序运行过程中需要大内存对象时,无法找到足够的连续内存而不得不提前出发另一次垃圾回收动作。
复制算法
为了解决效率问题,复制算法将内存分为大小相等的两块,每次只使用其中的一块。当一块内存用完了,就将回收后剩下的对象复制到另一块上,然后把已经使用过的内存一次清理掉。这种算法简单高效,代价是将内存缩小为原来的一半。
现在的商业虚拟机都使用经过改进的复制算法来回收新生代。在新生代中,98%的对象是朝生夕死的,所以并不需要按照1:1的比例来划分内存空间。而是分为一块较大的Eden和两块较小的Survivor空间。每次使用Eden和一块Survivor,当回收时,将Eden和Survivor中的存活对象一次性复制到另一款Survivor中。默认是8:1:1,每次使用90%的内存,浪费很少。当偶尔Survivor空间不够用时,需要依赖其他内存(老年代)进行分配担保。
标记-整理算法
复制收集算法在对象存活率较高时,效率会遍地变低。根据老年代的特点,使用标记-整理算法。在标记过后,让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。
分代收集算法
根据对象存活周期的不同将内存划分为几块,一般是把Java堆分为新生代和老年代,根据不同代的特点采用不同的回收算法。新生代存活率低,使用改进的复制算法,老年代存活率高,使用标记-整理算法或标记-清除算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JVM java 虚拟机