虚拟机内的垃圾收集算法

Posted lz81

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟机内的垃圾收集算法相关的知识,希望对你有一定的参考价值。

我这只是介绍虚拟机内的垃圾收集算法大致介绍,因为每一种垃圾收集算法都涉及到大量的程序代码细节,而且各个平台的虚拟机操作内存的方法又各不一样,因此我这里就不对算法的实现做描述了;

1标记-清除算法

标记清除算法是最基础的算法,如名一样,分为 “标记 ”和 “清除”两个阶段,首先是标记哪些对象是需要清除的,哪些对象是需要清除的也就是不可能被任何途径使用的对象也称为“死对象”,标记完之后再统一回收被标记的所有对象,这种算法存在两个问题:一是效率问题,标记和清除两个过程的效率都不高,二是空间问题,被清除的对象会留下大量不连续的空间碎片,空间碎片太多可能会导致后续程序运行过程中需要分配较大内存的时候,找不到足够大连续的内存而触发再一次的垃圾收集动作;

技术分享图片

 

2复制算法

标记清除算法效率不高,为了解决效率问题,复制算法出现了,它将可用内存分为大小相等的两块,虽然有两块但是它就只用一块,当这一块内存用完了,它再将还存活的对象的对象复制到另外一块上,然后再将用过的那一半内存空间一次情掉,这样每次都是对整个半区清理,内存分配的时候也就不用考虑空间碎片的问题;

技术分享图片

3标记-整理算法

复制算法不知道大家有没有注意到,当一半内存存活数量很高的时候会做大量的复制操作,这样效率还是不够高,之后又有人提出另外的一种算法,标记整理算法,和标记清除算法一样,只是标记整理算法有后续的操作,就是对可回收对象进行整理,还存活的对象一边移,然后清理边界以外的内存

技术分享图片

4分代收集算法

当前商业虚拟机的垃圾收集算法都采用的是分代收集算法,这种算法并没有什么心的思路,只是根据对象存活的周期不同将内存划分为几块,一般是把java堆分为新生代和老生代,这样就可以根据各个年代的特点对才用最适当的算法,在新生代中每次垃圾收集时都会有大量的对象死去只有少量存活就才用复制算法,而老年代中,因为对象存货率高,没有额外的空间对它们进行分配担保,就必须才用标记清理或者标记整理算法来进行回收;

 

以上是关于虚拟机内的垃圾收集算法的主要内容,如果未能解决你的问题,请参考以下文章

深入理解java虚拟机GC垃圾回收-垃圾收集算法

深入理解java虚拟机GC垃圾回收-垃圾收集算法

java虚拟机学习--垃圾收集算法

jvm,深入理解java虚拟机,垃圾收集算法与垃圾收集器

jvm,深入理解java虚拟机,垃圾收集算法与垃圾收集器

Java虚拟机垃圾回收: 7种垃圾收集器(转载)