ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

JVM GC之------标记清除 与 标记整理

JVM GC之------标记清除 与 标记整理 JVM 标记 - 清除Mark-Sweep、标记 - 整理Mark-Compact这两个都是垃圾回收算法作用识别堆中死亡对象回收内存区别在回收后怎么处理存活对象。补充还有复制算法一般新生代用复制老年代常用标记清除 / 标记整理。一、标记 - 清除 Mark-Sweep两个阶段标记阶段 → 清除阶段标记从 GC Roots 出发遍历把所有存活对象打上标记。清除扫描整个堆没有标记的对象就是垃圾直接回收存活对象原地不动。示意图简述[存活][垃圾][存活][垃圾][存活] 标记后 [存活√][垃圾×][存活√][垃圾×][存活√] 清除后 [存活√][空闲][存活√][空闲][存活√]✅优点不需要移动对象开销小不会损失内存适合大量存活对象的场景老年代。❌缺点内存碎片回收后空闲内存是零散的。当要分配大对象时找不到连续空间提前触发 GC。两次扫描堆标记扫一次清除再扫一次堆越大耗时越长。应用CMS 收集器Concurrent Mark Sweep就是标记清除。二、标记 - 整理 Mark-Compact标记阶段和标记清除完全一样区别在回收之后标记GC Roots 遍历标记存活对象。整理压缩不是直接清垃圾。把所有存活对象向堆的一端移动、紧凑排列全部挤在一起然后一次性清理掉边界以外的全部垃圾。[存活][垃圾][存活][垃圾][存活] 标记后 [存活√][垃圾×][存活√][垃圾×][存活√] 整理压缩后 [存活√][存活√][存活√][空闲空闲空闲]✅优点无内存碎片空闲内存是一整块连续空间分配大对象很友好内存分配简单用指针碰撞Bump The Pointer即可。❌缺点需要移动对象移动对象还要更新所有引用地址STWStop-The-World时间更长开销大。移动对象是全堆操作堆越大整理越慢。应用G1 的部分场景、Serial Old、Parallel Old 老年代收集器是标记整理。三、核心对比表算法步骤是否移动对象内存碎片STW适用场景标记 - 清除标记 → 清除❌不移动产生大量碎片相对短老年代存活对象多追求低 STWCMS标记 - 整理标记 → 移动压缩 → 清理✅移动存活对象无碎片较长老年代希望避免碎片四、面试高频问题1. CMS 为什么不用标记整理CMS 主打并发低停顿移动对象必须暂停所有用户线程STW代价极高所以 CMS 选用标记清除牺牲碎片换低 STW碎片问题到阈值触发 Full GC。2. 标记整理移动对象引用怎么处理移动完存活对象后更新所有指向这些对象的引用地址让引用指向新位置。这个过程是 STW 里完成。3. 复制算法和标记整理区别复制把存活对象复制到另一块空白内存原区域全部清空需要两块内存浪费一半空间适合新生代存活对象少。标记整理在同一块内存原地压缩不需要额外内存。五、CMS / G1 / ZGC收集器总览新生代复制算法为主老年代标记清除 / 标记整理收集器不是单一算法很多是组合算法新生代一套老年代一套。1. Serial串行收集器新生代复制算法老年代Serial OldSerial 收集器的老年代版本标记 - 整理特点单线程收集全程 STW收集时用户线程全部暂停。使用场景客户端、内存很小的程序。面试点最古老收集器单线程STW 长。2. Parallel并行收集器Parallel Scavenge Parallel Old新生代 Parallel Scavenge复制算法老年代 Parallel Old标记 - 整理特点多线程 GC用户线程暂停目标是可控吞吐量吞吐量 运行代码时间 / 总时间关注点优先保证吞吐量而不是单次停顿时间。面试吞吐量优先收集器适合后台计算型任务。3. CMSConcurrent Mark Sweep并发标记清除新生代复制算法老年代标记 - 清除算法目标低停顿尽量和用户线程并发执行。CMS 四个阶段初始标记STW只标记 GC Roots 直接引用对象很快并发标记和用户线程一起遍历整个对象图耗时最长无 STW重新标记STW修正并发标记期间用户线程修改产生的漏标对象并发清除和用户线程并发清理垃圾不移动对象CMS 缺点标记清除 →内存碎片碎片多了会触发 Full GC此时会用 Serial Old 做标记整理压缩并发阶段占用 CPU多核机器才划算浮动垃圾并发清理时新产生的垃圾本次 GC 无法回收只能留到下一次不能等到老年代满了再 GC要预留内存给并发阶段使用重点CMS不压缩对象所以才会碎片如果要压缩就必须移动对象移动对象无法并发必须 STW。4. G1Garbage-FirstJDK9 默认收集器区域化Region不再严格区分新生代老年代逻辑上仍有年轻区、老年代区。整体思想标记整理局部Region 之间使用复制算法算法本质全局标记整理不会产生内存碎片Region 内部回收存活对象时复制到空闲 Region工作流程初始标记STW并发标记最终标记STW筛选回收STW挑选垃圾最多的 Region 优先回收Garbage-First 名字来源特点可预测停顿模型用户可指定期望最大停顿时间。和 CMS 区别CMS 是整个老年代一起 GCG1 只选垃圾最多的 Region增量回收。G1 回收后存活对象复制到别的 Region天然整理无碎片。5. ZGCZ Garbage CollectorJDK11算法标记 - 整理核心目标超低 STWSTW 时间几乎和堆大小无关TB 级堆也可以做到毫秒级停顿核心技术读屏障 染色指针Colored PointerZGC 几乎所有阶段都并发标记、转移移动对象、重定位只有短暂 STW。 移动对象的时候引用还没来得及更新靠染色指针记录对象新地址访问时读屏障做转发。特点无内存碎片支持超大堆低延迟。6. ShenandoahJDK12算法标记整理和 ZGC 思路接近并发压缩读屏障低延迟区别Shenandoah 使用转发指针ZGC 使用染色指针。汇总表收集器新生代算法老年代算法特点Serial Serial Old复制标记 - 整理单线程STW 长Parallel Scavenge Parallel Old复制标记 - 整理多线程吞吐量优先CMS复制标记 - 清除并发低停顿有碎片G1局部复制全局标记整理标记整理Region 分区可预测停顿无碎片ZGC标记整理标记整理并发移动对象毫秒级 STWShenandoah标记整理标记整理并发压缩转发指针面试高频连环题Q1CMS 为什么不用标记整理标记整理需要移动对象移动对象必须更新所有引用这个过程没法并发会产生很长 STW。CMS 的设计目标就是低停顿所以选择标记清除牺牲碎片。碎片严重时会退化到 Serial Old 做 Full GC 压缩。Q2G1 是标记整理吗为什么又说用到复制算法G1全局是标记整理保证没有碎片回收单个 Region 的时候把存活对象复制到别的空闲 Region这个局部动作就是复制。本质是通过复制来完成整理。Q3ZGC 标记整理移动对象为什么几乎没有 STWZGC 是并发转移。移动对象这个动作不需要暂停用户线程。依靠染色指针 读屏障对象被移走之后旧指针不会立刻修改用户线程访问旧对象时触发读屏障自动转发到新地址。只有非常短暂的 STW。Q4CMS 和 G1 的核心差异CMS整个老年代统一扫描回收G1拆成 Region优先回收垃圾最多区域CMS标记清除产生碎片G1标记整理无碎片CMS只能调并发阈值G1 支持设置期望最大停顿时间可预测Q5G1 和 ZGC 的区别G1 的筛选回收阶段是 STW停顿时间随堆变大缓慢上涨ZGC 对象转移并发STW 固定很小堆多大影响不大适合 TB 级大堆超低延迟场景。
返回列表