这篇“JVM垃圾回收算法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JVM垃圾回收算法是什么”文章吧。
标记-清除(Mark-Sweep)算法是最早出现也是最基础的垃圾收集算法。顾名思义,标记-清除算法分为两个阶段:
标记:标记出所有需要回收的对象
清除:清除掉所有被标记的对象
优点:
简单,容易理解
垃圾少时,效率高
缺点:
会产生内存空间碎片,内存空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾回收动作
性能不稳定,如果内存中大部分都是要回收的垃圾对象,标记和清除效率会随着垃圾的数量而降低
为了解决标记-清除算法面对大量可回收对象时执行效率低的问题,于是有了复制(Copying)算法。复制算法是将内存一分为二,当一块内存使用完成之后,会将存活的对象移动到另一块预留未使用的内存空间,然后将使用过的那块内存空间清理掉。
优点:
实现简单,运行高效
不会产生内存空间碎片
缺点:
因为要预留一半内存空间,所以内存空间浪费严重
如果内存中多数对象都是存活的,这种算法将会产生大量的内存间复制的开销
在1989年,Andrew Appel针对具备“朝生夕灭”特点的对象,提出了一种更优化的半区复制分代策略,现在称为“Appel式回收”。具体做法是分配一块较大的Eden区和两块较小的Survivor区(可以叫做From区和To区,也可以叫做Survivor1区和Survivor2区)。
研究表明,新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块 Survivor空间。当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和已经用过的Survivor空间。也就是说,浪费的空间只有一个Survivor空间。
HotSpot虚拟机新生代比例Eden和Survivor空间比例为8:1:1
,在使用的时候只使用Eden区和一个Survivor区,也就是说,新生代有90%的空间是在使用的,只有10%的空间是浪费的。新生代中98%的对象可被回收仅仅是“普通场景”下测得的数据,任何人都没有办法百分百保证每次回收都只有不多于10%的对象存活,因此,在Survivor空间不足的情况下,就需要依赖其他内存进行分配担保(Handle Promotion),一般是老年代。就是说如果Survivor空间不足,对象就需要以分配担保的形式进入老年代。
标记-整理算法首先标记出所有需要回收的对象,在标记完成后,后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
优点:
不会产生内存空间碎片
相较于复制算法,不会有多余空间浪费
缺点:
需要移动对象,效率低。对象移动不单单会加重系统负担,同时需要全程暂停用户线程才能进行,也就是常说的“Stop The World”,同时所有引用对象的地方都需要更新。
标记整理与标记清除算法的区别主要也在于对象的移动。
以上就是关于“JVM垃圾回收算法是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。