CODE大全
版权声明:本文为博主原创文章,未经博主允许不得转载。

JVM垃圾回收算法

发布时间:『 2017-07-30 13:55』  博客类别:编程语言  阅读(1752) 评论(0)

关于 JVM 的垃圾回收算法网上有很多的文章,我就不在详细的介绍。本文主要讲解我个人对 JVM 垃圾回收算法的理解。

jvm 垃圾回收算法

  • 标记清除算法

  • 复制算法

  • 标记整理算法

  • 分代收集算法

下面将分别对这4中垃圾回收算法进行讲解。

标记清除算法

标记-清除算法(Mark-Sweep)是最基础的收集算法。首先标记出所需要回收的对象,在标记完成后统一回收所有被标记的对象。

该算法的不足之处主要有两点:

  • 效率问题,标记和清除两个过程的效率都不高。

  • 空间问题,清除之后会产生大量的不连续的内存碎片,内存碎片太多可能会导致要分配较大对象时,无法找到足够的连续内存而不得不提前触发下一次垃圾收集动作。

回收过程如下:

标记清除算法垃圾回收过程

复制算法

为了解决效率问题,复制算法(Copying)出现了,他将内存分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就把存活的对象复制到另一块上,然后把这一块空间全部清理掉。这样是的每次是对整个半区就行内存回收,内存分配时也不用考虑内存碎片的复杂情况,只需要移动指针,按顺序分配内存即可。

只是这种方法的代价是将内存分为之前的一半,未免太高了。

垃圾过程如下:

复制算法垃圾回收过程

现在的商业虚拟机都是采用这种方法来回收新生代,IBM公司的专门研究表明,新生代中98%的对象是“朝生夕死”的,所以并不需要1:1来划分内存空间。另一种方法是:将内存块分为Eden空间(80%)和两块Survivor空间(10%),每次使用Eden空间和一块Survivor空间,回收时将存活的对象复制到另一块Survivor空间上,这样每次只有10%的空间被“浪费”。当Survivor空间不够用时,需要依赖其他内存(老年代)来进行分配担保(同过分配担保机制进入老年代)。

标记整理算法

当复制收集算法在对象存活率较高时就要进行较多的复制动作,效率会变慢。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以老年代一般不能选用这种方法。标记-整理算法(Mark-Compact)就被提出了。

标记过程和“标记-清除”算法一样,但是后续步骤不是直接对可回收部分进行清理,而是把存活对象都向一端移动,然后直接清理掉端以外的内存。

垃圾过程如下:

20170728185106180.png

分代收集算法

当前商业虚拟机都采用分代收集算法(Generational Collection),一般是把堆分为新生代和老年代,根据各个年代的不同特点采用最适合的算法。新生代一般采用复制算法,只需要付出少量存活对象的复制成本即可;老年代因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或者“标记-整理”算法来进行回收。


——— 全文完 ———
如有版权问题,请联系532009913@qq.com。
关键字:   JVM     垃圾回收     算法     分代收集算法     标记整理算法  
评论信息
暂无评论
发表评论
验证码: 
Powered by CODE大全 | 鄂ICP备14009759号-2 | 网站留言 Copyright © 2014-2016 CODE大全 版权所有