【JVM】垃圾回收算法

4种JVM垃圾回收算法

标记清除算法

标记-清除算法将垃圾回收分为两个阶段,标记阶段和清除阶段

在标记阶段首先通过GC Roots,标记所有从根节点开始的对象,未被标记的对象就是未引用的垃圾对象。然后,在清除阶段,清除未被标记的对象。

适合场景:

1、存活对象较多的情况下比较高效

2、使用于老年代

缺点:

1、容易产生内存碎片,再来一个较大对象时。会提前触发消息回收(即,对象的大小大于空闲中的每一块大小,但是小于其中两块的和)

2、扫描了整个空间两次。第一次:标记存活对象,第二次:清除没有标记的对象

复制算法

从根节点进行扫描,标记出所有存活的对象,并将这些存活对象复制到一块新的内存,之后将原来那块的内存全部回收掉

现在的商用虚拟机都采用这种收集算法来回收新生代。

适用场景:

1、存活对象较少的情况下比较高效

2、扫描了整个空间一次(标记存活对象并且复制移动)

3、适用于年轻代,基本99%的对象都是朝生夕死,存活下来的很少

缺点:

1、需要一整块空闲的内存空间

2、需要复制移动对象

标记整理算法

复制算法的高效是建立在存活对象少,垃圾对象多的前提下

这种情况在新生代经常发生,但是在老年代里更常见的情况是大部分对象都是存活地下,如果依然使用复制算法,由于存活的对象较多,复制的成本也会很高。

标记清除整理算法是一种老年代的回收算法,在标记清除算法的基础上做了优化/

首先需要从根节点开始对所有的可达对象做一次标记,但之后,它并不是简单的清理未被标记的对象,而是将存活对象整理到内存的一端,然后清理边界外所有的内存空间。这种方法避免了碎片的产生,又不需要两块相同的内存空间,因此,性价比较高

分代回收算法

(新生代 - 复制算法;老年代 - 标记清除或者标记整理算法 )

分代回收算法是目前虚拟机使用的算法,它解决了复制算法不适用于老年代的问题,将内存分为各个年代。一般情况下堆区分为老年代和年轻代,在堆之外还有另外一个就是永久代。

在不同的年代使用不同的算法,从而适用最合适的算法。新生代存活率低,可以适用复制算法,而老年代存活率高,没有额外的空间对它进行分配,可以使用标记清除或者标记整理算法

相关推荐
lzhdim3 小时前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
凤凰院凶涛QAQ5 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
w_zero_one7 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David8 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
秋天的怀念_David8 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪8 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪9 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
小羊没烦恼!10 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.11 小时前
202609CSP认证P3
算法
需要82611 小时前
容器化 Java:镜像瘦身与 JVM 容器感知(cgroup)
java·开发语言·jvm