有哪些jvm垃圾回收算法

介绍

这篇文章将为大家详细讲解有关有哪些jvm垃圾回收算法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

jvm垃圾回收算法:1、“标记——清除“算法;首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉所有被标记的对象。2,复制算法,将内存划分为等大的两块,每次只使用其中的一块。3,“标记——整理”算法;4,分代收集算法。

<强> jvm垃圾回收算法

<人力资源/>

<强>两个概念:

<强>新生代:存放生命周期较短的对象的区域。
老年代:存放生命周期较长的对象的区域。

<强>相同点:都在Java堆上

<强> 1。标记——清除算法

<强>执行步骤:

<李>

标记:遍历内存区域,对需要回收的对象打上标记。

<李>

清除:再次遍历内存,对已经标记过的内存进行回收。

<强>图解:

有哪些jvm垃圾回收算法”> <br/> <img src=

<强>缺点:

<李>

效率问题,遍历了两次内存空间(第一次标记,第二次清除)。

<李>

空间问题:容易产生大量内存碎片,当再需要一块比较大的内存时,无法找到一块满足要求的,因而不得不再次出发GC。

<强> 2。复制算法

将内存划分为等大的两块,每次只使用其中的一块。当一块用完了,触发GC时,将该块中存活的对象复制到另一块区域,然后一次性清理掉这块没有用的内存。下次触发GC时将那块中存活的的又复制到这块,然后抹掉那块,循环往复。

<强>图解:

有哪些jvm垃圾回收算法

有哪些jvm垃圾回收算法

<>强优点

<李>

相对于标记——清理算法解决了内存的碎片化问题。

<李>

效率更高(清理内存时,记住首尾地址,一次性抹掉)。

<强>缺点:

<李>

内存利用率不高,每次只能使用一半内存。

<强>改进

研究表明,新生代中的对象大都是“朝生夕死”的,即生命周期非常短而且对象活得越久则越难被回收。在发生GC时,需要回收的对象特别多,存活的特别少,因此需要搬移到另一块内存的对象非常少,所以不需要1:1划分内存空间。而是将整个新生代按照8:1:1的比例划分为三块,最大的称为伊甸园(伊甸园)区,较小的两块分别称为幸存者和幸存者。

首次GC时,只需要将伊甸园存活的对象复制到。然后将伊甸园区整体回收。再次GC时,将伊甸园和来存活的复制到,循环往复这个过程。这样每次新生代中可用的内存就占整个新生代的90%,大大提高了内存利用率。【相关推荐:Java视频教程】

但不能保证每次存活的对象就永远少于新生代整体的10%,此时复制过去是存不下的,因此这里会用到另一块内存,称为老年代,进行分配担保,将对象存储到老年代。若还不够,就会抛出伯父。

老年代:存放新生代中经过多次回收仍然存活的对象(默认15次)。

<强> 3。标记——整理算法

因为前面的复制算法当对象的存活率比较高时,这样一直复制过来,复制过的去,没啥意义,且浪费时间,所以针对老年代提出了“标记整理”算法。

<强>执行步骤:

<李>

标记:对需要回收的进行标记

<李>

整理:让存活的对象,向内存的一端移动,然后直接清理掉没有用的内存。

<强>图解:

有哪些jvm垃圾回收算法”> <br/> <img src=

<强> 4。分代收集算法

当前大多商用虚拟机都采用这种分代收集算法,这个算法并没有新的内容,只是根据对象的存活的时间的长短,将内存分为了新生代和老年代,这样就可以针对不同的区域,采取对应的算法。如:

有哪些jvm垃圾回收算法