垃圾回收算法的前世今生(转)
Posted money131
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了垃圾回收算法的前世今生(转)相关的知识,希望对你有一定的参考价值。
1.引用计数法(java未采用)
2.标记-清除算发(jvm老年回收)
3.标记-压缩算发(jvm老年回收)
4.复制算法(jvm新生代回收)
标记-清除算法
标记-清扫式垃圾回收器是一种直接的全面停顿算法。简单的说,它们找出所有不可达的对象,并将它们放入空闲列表Free。
清扫过程将分为标记阶段和清扫阶段
缺点:需要扫描整个堆区,时间开销较大。
标记压缩算法:
①标记阶段,通过根节点标记所有可达(直接或间接可访问)对象,和标记-清除法类似;
②清除阶段,将上一轮存活对象压缩到内存的一端,之后清理边界。
优点:可以减少内存碎片,避免分配大对象时空间不够。
复制算法:
它将堆上的内存分为两个大小相等的区域,一个是空闲区域,一个是活动区域。在程序运行中,实际使用的是活动区域,也就是有50%的空间被浪费掉。
实现过程:1.找出活动空间中所有存活的对象。2.将这些存活的对象复制到空闲区域。3.将之前的活动空间清空,然后,就变为空闲空间了,而存活对象所在的区域,则变为活动空间了。
优点,就是,内存回收完毕后,有一大片连续的可用空间。缺点,当然是,在程序运行期间,有50%的内存空间被放着,只有在发生内存回收的时候,GC才会借用空闲区域来实现内存回收工作。
复制算法与标记-压缩法对比:
复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以复制算法仅仅应用在新生代,而老年代一般不能直接选用这种算法,使用标记-压缩法。
标记-压缩法与标记-清除法对比:
根据老年代的特点,有人提出了“标记-压缩”(Mark-Compact)算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。也可以减少内存碎片。
参考资料来源:
http://www.cnblogs.com/ttylinux/p/3886561.html
https://blog.csdn.net/m0_37860933/article/details/82154989
以上是关于垃圾回收算法的前世今生(转)的主要内容,如果未能解决你的问题,请参考以下文章