标记清除算法分标记和清除两阶段:先从gc roots出发遍历标记存活对象,再扫描堆内存释放未标记空间;不移动对象但易产生碎片,适用于存活率低场景。

Java 中的标记清除算法通过两个明确阶段完成内存清理:先识别哪些对象还“活着”,再集中回收其余空间。
标记阶段:从根出发,圈出所有存活对象
垃圾回收器以 GC Roots(如栈中局部变量、静态字段、本地方法栈引用等)为起点,沿着引用链逐层遍历。所有能被访问到的对象都被打上“存活”标记。这个过程不关心对象是否即将被丢弃,只确保真正还在使用的对象不会被误删。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- GC Roots 包括:虚拟机栈中的引用、方法区的静态变量、常量池中的字符串、JNI 引用
- 遍历采用深度优先或广度优先方式,确保不遗漏任何可达路径
- 标记本身不移动对象,只修改对象头中的标记位
清除阶段:扫描堆内存,释放未标记区域
标记完成后,回收器线性扫描整个堆(或目标区域),对每个未被标记的对象执行清理操作——归还其占用的内存块,并更新空闲列表或指针。
- 已标记对象保持原位置不动,状态还原(如清除标记位)
- 未标记对象所占内存被直接释放,但不进行整理
- 释放后的空间可能零散分布,形成内存碎片
实际运行中的关键特点
该算法不移动对象,实现轻量,但代价是内存布局不可控。当大量小对象被回收后,剩余空闲空间可能被分割成多个小块,导致后续分配大对象时即使总空闲足够,也无法找到连续区域,从而提前触发下一次 GC。
- 适用于对象存活率低、回收频繁的场景(如年轻代早期设计,但现代 JVM 已较少单独使用)
- Stop-the-World 时间主要消耗在标记遍历和全堆扫描上
- JVM 不直接暴露标记清除为独立策略,而是作为 CMS(已废弃)和 Serial Old 等收集器的底层逻辑之一
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










