JVM常见的垃圾回收算法

Posted msqz

tags:

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

          JVM常见的垃圾回收算法

  1、标记-清除算法

    标记清除算法也是最基础的算法,就如同他的名字一样,标记清除算法的步骤分为两个步骤,首先标记出需要回收的所有对象,然后在完成标记之后统一清除掉所有被标记的对象,之所以说它是最基础的算法,是因为后续算法都是基于此算法,改进其缺点衍生出来的,标记清除算法有两个缺点,标记和清除这两个步骤都会有性能损耗,且效率低,其次是在完成对象的清除后会留下不连续的内存碎片,算法如下图:

       技术分享图片

 

 

2、复制算法

         为了提高效率,我们又引入了复制算法,将现有可用的内存大小均分为二,每次只使用其中一半,当这半内存已满,就将未消亡的对象copy到另一半去,然后再把使用过的内存清除掉,往复如此,每次分配内存我们只需要按照顺分配,就不需要考虑产生内存碎片,高效运行,但也有一个缺点,就是每次可以使用的内存减半,算法如下图:

 

       技术分享图片

 

 

 

3、标记-整理算法

          我们发现,在对象存活率较高的时候(老年代的特点),每次复制都包含了对大量存活对象的copy,这个时候就会大大降低复制算法的效率,除此之外,我们也不想可用内存减半,这时候我们就需要引入标记整理算法,标记整理算法也分为两个步骤,第一步标记和标记清理算法一致,标记需要回收的对象,不过第二步不是直接回收,而是将村会的对象向可用内存空间某一端移动,而清除掉端边界以外的内存。算法如图:

       技术分享图片

 

4、分代收集算法

    目前商用虚拟机所使用的收集算法,将内存分为多个模块,把新生的对象存储在新生代(也叫年轻代),将新生代多次gc依旧存活的对象移动到老年代中。

    新生代:存储新创建的对象,gc时往往伴随着大量的需要回收的对象,所以新生代采用复制算法,只需将少量存活对象copy,就可以完成对象回收。

    老年代:当新生代创建的对象经历多次gc依旧存活之后,就会将他移动到老年代,所以在对老年代的对象进行回收时,往往伴随着大量存活的对象,这时候就可以选择 标记清除算法标记整理算法。

       持久代:存放静态文件,java类、方法等,对垃圾回收并无太大影响

 

 

 

          

 

 

以上是关于JVM常见的垃圾回收算法的主要内容,如果未能解决你的问题,请参考以下文章

JVM垃圾回收器+垃圾回收算法

JVM07:常见的几种垃圾回收器和引用类型

JVM常见垃圾回收算法

JVM常见的垃圾回收算法

JVM系列 - JVM垃圾回收器

JVM学习记录-垃圾回收算法