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

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

猜你喜欢

转载自www.cnblogs.com/money131/p/10664453.html