JVM

浏览该分类下的所有文章

JVM垃圾收集器ParNew&CMS与底层三色标记算法

文章介绍了JVM分代回收的基本原理,阐述了新生代采用复制算法、老年代使用标记‑清除或标记‑整理的原因,并详细比较了Serial、Parallel、ParNew、CMS等收集器的实现与适用场景。重点解析了CMS的四阶段并发标记、三色标记、写屏障及其产生的浮动垃圾、漏标问题,提供了ParNew+CMS在大流量电商系统中的参数调优方案,强调通过合理设置堆、Survivor、晋升阈值等可降低Full GC频率,提高响应时延。

JVM垃圾收集器汇总

Serial 是单线程复制收集器,适用于 Client 模式小堆,停顿可接受;ParNew 为其多线程版,可配合 CMS 使用,在 Server 环境多 CPU 时提升并行度。Parallel Scavenge 同样是多线程复制收集器,侧重吞吐量,通过‑XX:GCTimeRatio、‑XX:MaxGCPauseMillis 调节;对应的老年代有 Serial Old(单线程标记‑整理)和 Parallel Old(多线程标记‑整理),后者与 Parallel Scavenge 组合实现高吞吐。CMS 采用并发标记‑清除,目标最短停顿,但对 CPU 敏感、产生碎片且无法处理浮动垃圾。G1 采用分区‑并行‑增量回收,提供可预测的停顿时间,调参主要是‑XX:MaxGCPauseMillis 等。整体上,JVM 提供了从单线程到并行、从低停顿到高吞吐的多种收集器,以满足不同应用场景的性能需求。

JVM垃圾收集器G1&ZGC

G1(-XX:+UseG1GC)将堆划分为约2048个等大小Region,保留但不强制分代,采用复制算法在STW阶段按“回收价值‑成本”优先选择Region,实现可预测的停顿(‑XX:MaxGCPauseMillis),并通过Humongous区专门处理大对象。G1的主要GC类型为Young、Mixed和Full,提供丰富的调优参数以平衡吞吐量和延迟,适合8 GB 以上、停顿要求在 0.5 s 以内的大内存服务器。 ZGC(-XX:+UseZGC)是 JDK 11 引入的低延迟收集器,目标是堆大小任意(TB 级)时仍保持 ≤10 ms 停顿,采用单代、Region(小‑2 MB、 中‑32 MB、 大‑≥4 MB)布局,利用读屏障、颜色指针和自愈转发表实现全并发标记‑整理,并自动感知 NUMA。ZGC 牺牲约 15% 吞吐以换取极短、可预测的停顿,适用于对延迟极为敏感的超大堆应用。

JVM内存模型深度剖析与优化

本文系统阐述了JVM的整体结构与内存模型,重点解释了Minor GC中对象复制后引用的更新机制——在根扫描阶段记录引用并在对象搬迁后统一指向新地址。随后列举了常用的JVM启动参数(‑Xms、‑Xmx、‑Xmn、‑Xss、‑XX:MetaspaceSize/MaxMetaspaceSize 等)及其含义与调优原则,指出元空间大小调整会触发代价高昂的Full GC,建议将两者设为相同且足够大。通过StackOverflowError 示例说明‑Xss 对线程栈容量和并发线程数的影响。最后给出面向日均百万级订单系统的调优建议:尽量让对象在新生代分配回收,避免频繁晋升至老年代,并为系统预留充足内存,降低GC次数。