
前言:
我们知道在堆内存中,会有自动的垃圾回收功能,那今天这篇文章将会向你介绍,这个功能实现的方式,还有实现的对象,接下来就由我来给你们详细介绍垃圾回收的算法和实现算法的回收器。
目录
3. CMS(Concurrent Mark-Sweep)收集器
常见的四种垃圾回收算法
标记清除算法
核心思想
通过 可达性分析 标记存活对象,直接回收未标记对象的内存
实现过程两个阶段
-
标记阶段(STW):
-
从 GC Roots(栈引用、静态变量等)出发,递归遍历对象图。
-
对存活对象打标记。
-
-
清除阶段(STW):
-
线性扫描堆内存。
-
回收未标记对象的内存块(加入空闲链表)。
-

优点:实现简单,第一阶段标记,第二阶段清除。
缺点:
- 碎片化内存:内存是连续的,如果在对象被删除之后,就会出现很多细小的内存,如果我们需要很大的内存空间,那么就很可能无法匹配。

很明显,无法做到,因为红色的就是空闲内存但是最大的才4个字节。
- 分配速度慢:内存碎片化,所以在回收内存之后,会把这段空闲内存加入一个空闲链表,每次分配内存都会遍历整个链表找到合适的位置。
使用场景
-
老年代回收:CMS 收集器的回收基础
-
大对象堆:对象存活率高,移动成本大
-
嵌入式系统:资源受限环境(如 RTOS)
标记整理算法
核心思想
在标记存活对象后,移动对象消除碎片,使空闲内存连续。我们可以把它看作是基于标记清除的一个处理碎片化内存的算法。
实现过程
-
标记阶段:
-
从 GC Roots(栈引用、静态变量等)出发,递归遍历对象图。
-
对存活对象打标记。
-
-
整理阶段(STW):
-
滑动整理:将存活对象“滑动”到内存一端。
-
清理:清理掉没有存活对象。
-

优点:
- 内存的使用效率高。
- 没有碎片化内存。
缺点:
- 整理阶段效率不高,效率是低于标记清除算法的
使用场景
-
老年代回收:Serial Old, Parallel Old, ZGC
-
低碎片需求:实时系统、长期运行服务
-
内存敏感场景:Android ART 的 Foreground GC
复制算法
核心思想
将内存分为两等份,只使用其中一份;GC 时将存活对象复制到另一份空间,清空原空间。
实现过程
-
内存划分:堆分为 From 区(当前使用)和 To 区(空闲),创建对象时都只在From区。
-
垃圾回收阶段(STW):
-
从 GC Roots 遍历存活对象
-
将存活对象复制到 To 区(保持紧凑排列),删除from区对象
-
交换 From/To 区角色
-


优点:
- 不会发生碎片化
- 回收高效(仅处理存活对象)
缺点:
- 内存使用率低,每次只使用一半的内存
- 对象复制开销大
使用场景
-
年轻代回收:HotSpot 的 Serial/ParNew/Parallel Scavenge
-
短命对象场景:对象存活率 < 10% 时最优
-
小内存区域:JVM 的 Survivor 区
分代gc算法
现代优秀的垃圾回收算法,会将上面的几种垃圾回收算法组合使用,其中应用最广的就是分代垃圾回收。
核心思想
基于

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



