java虚拟机(jvm)垃圾收集算法剖析

来源:互联网 发布:森田疗法 知乎 编辑:程序博客网 时间:2024/05/21 08:54

目前商业虚拟机的垃圾收集都采用“分代收集”算法,这种算法根据对象的存活周期把内存划分为“新生代”和“老年代”。然后根据不同的年

代的特点采取不同的收集算法。在新生代中,由于每次minor GC都发现有很多对象死去,存活的非常少,因此采用复制算法。而老年代中对

象存活率非常的高,而起没有额外的内存空间进行分配担保就采用“标记-清理”或“标记-整理”算法来进行回收。但是基本上使用的“标记-整理”算

法,“标记-清理”算法使用非常的少。


下面对“复制算法”和“标记-整理”算法以图文的方式给大家进行介绍:


一、复制算法(年轻代)


1).原理:

它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当一块用完之后,就将还存活的对象复制到另外一块上面,然

后再把已使用过的内存空间一次清理掉。


2).好处:

每次都是对其中一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。只要移动堆顶指针,按顺序分配内存即可,实现简单,

运行高效。


3).缺点:

将内存缩小为原来的一半,浪费了一半的空间。


4).复制过程图(来源于网络)





5).jvm中应用


jvm的年轻代采用的这种回收方式,在jvm中默认把堆空间的年轻代按照8:1:1的比例分为Eden:Survivor:Survivor。每次虚拟机只使用

eden和其中一个Survivor区域。另外一个Survivor空间是空的。当回收的时候,将eden和surivor中还存活着的对象一次性地拷贝到另外一块


surivor空间上,然后对eden和之前使用过的surivor空间进行清理。所以每次新生代能够使用90%的空间。


可能大家有所疑问假如回收还存活的对象占有空间大于10%怎么办?当survivor空间不够用时,可以依赖老年代进行分配的担保。

survivor中不能容纳的对象直接进入老年代。但是前提是老年代还有空间容纳这些对象。如果担保失败,将会进行full gc。


二、标记-整理算法(老年代)


1).原理:

算法分为“标记”、“整理”两个步骤,首先标记出所有需要回收的对象,然后将所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。


2).优点:

内存回收不会产生内存碎片。


3).缺点:

需要移动对象,成本相对"标记-清理"算法较高。


4).复制过程图(来源于网络)





5).jvm中应用:

在老年代中因为对象存活率高,没有额外空间对它进行分配担保,必须使用"标记-清理"或“标记-整理”算法进行回收。但是基本上

使用“标记-整理”算法。


注明:

1).“标记-清理”和”标记-整理“非常的相似,只是标记完成后直接对可回收的对象进行清理。这种方式导致了大量的碎片,它也是最基

础的收集算法。


     2).文章中使用的图参考于网络(http://blog.csdn.NET/java2000_wl/article/details/8022293)。

0 0
原创粉丝点击