垃圾回收算法的前世今生(转)

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

以上是关于垃圾回收算法的前世今生(转)的主要内容,如果未能解决你的问题,请参考以下文章

裴佳豪:垃圾回收器的前世今生

JVM的垃圾回收机制 总结(垃圾收集回收算法垃圾回收器)

扒一扒JVM的垃圾回收机制,下次面试你准备好了吗

C#垃圾回收机制(GC)

C#垃圾回收机制(GC)

Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略[转]