目前商业虚拟机的垃圾收集都采用“分代收集”算法,这种算法根据对象的存活周期把内存划分为“新生代”和“老年代”。然后根据不同的年
代的特点采取不同的收集算法。在新生代中,由于每次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)。
---------------------------------------------------------------------------版权声明------------------------------------------------------------------------------------------
版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:http://blog.csdn.net/mr_smile2014