本文主要是介绍【JVM】GC垃圾回收(三)——零落成泥碾作尘,只有香如故,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【引子】
当世界上最后一个记得我的生命也忘记了我的时候,我该如何自处呢?我想我会最后看一眼我深爱的故乡,然后将占用这个世界的最后一缕精华也散去,让灵魂永归沉寂。GC垃圾回收机制也是如此,每一个最终消亡的对象,都会从堆中完全消失,只有它为我们对数据处理后的结果依然留存。
【正文】
那么JVM的是如何把已经失去所有引用的对象拿走的呢?
下面介绍几种经典的算法思想
1.标记-清楚算法
就是先标上对象已死,然后释放空间
但是有两个不足:a. 标记和清除两个过程,都是一块一块内存处理的,效率比较低
b.清除后,产生大量内存碎片,不好利用
2.复制算法:针对不足a,
只用一半内存,然后这半个需要内存回收的时候,把存在的对象复制一份存到原先空余的连续地址上
这样清除的时候,可以一下子释放整个半个的内存
因为新生代的对象98%是朝生夕死的, 所以不需要按照1:1比例来划分内存空间 。 而是将内存分为一块较大的Eden空间和两块较小的Survivor空间。每次使用Eden和其中一块Survivor,当回收时,将 还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理Eden和刚才用过的Survivor。 Eden和Survivor大小比例是8:1.
3.标记-整理算法
因为存活率较高时,复制算法要复制过多的对象,所以效率会变低。 如果不想要浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以老年代一般不能直接选用这种算法。
【总结】
零落成泥碾作尘,只有香如故。
这篇关于【JVM】GC垃圾回收(三)——零落成泥碾作尘,只有香如故的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!