GC基本原理
- 可达性分析算法
Java通过根可达性分析判断对象存活状态。从GC Roots(如虚拟机栈引用的对象、静态变量、JNI 引用等)出发,遍历对象引用链,未被引用的对象标记为可回收。
优势:解决循环引用问题,避免内存泄漏。 垃圾回收算法
- 标记-清除(Mark-Sweep):标记存活对象后清除未标记对象,但会产生内存碎片。
- 复制算法:将内存分为Eden和Survivor区,存活对象复制到另一区域,适合新生代(空间利用率50%)。
- 标记-整理(Mark-Compact):标记后压缩存活对象至内存一端,消除碎片,适合老年代。
- 分代算法:结合对象生命周期,新生代用复制算法,老年代用标记整理。
分代回收机制
Java堆分为新生代和老年代,不同区域采用差异化回收策略:
新生代结构
- Eden区:新对象分配的主要区域(默认占80%)。
- Survivor区(S0/S1):Minor GC后存活对象在此复制,年龄计数器决定晋升老年代(默认阈值15)。
GC类型与触发条件
- Minor GC:Eden区满时,高频、快速,存活对象复制到Survivor区。
- Major GC/Full GC:老年代空间不足、方法区(元空间)满载或显式调用System.gc()时触发,耗时较长。
- Mixed GC(G1特有):同时回收部分新生代和老年代Region。
对象晋升规则
- 年龄阈值:对象在Survivor区每存活一次Minor GC年龄+1,达阈值则晋升。
- 动态年龄判断:同年龄对象总大小超Survivor区一半时,直接晋升。
GC触发条件与优化策略
触发条件:
- Minor GC:Eden区分配失败、TLAB(线程本地分配缓存)不足。
- Full GC:老年代空间不足、永久代(元空间)满载、System.gc()调用。
调优策略:
- -Xmx/-Xms:设置最大/初始大小,避免动态扩展引发Full GC。
- -XX:MaxTenuringThreshold:调整对象晋升年龄阈值。
- -XX:+UseG1GC:启用G1收集器,平衡吞吐与延迟。
- 避免大对象直接进入老年代(如大数组)。
- 减少全局变量和静态集合类引用,防止内存泄漏。
经典分代收集器
Serial收集器
- 特点:单线程执行,全程STW(Stop-The-World),采用复制算法(新生代)和标记-整理算法(老年代)。
- 适用场景:单核CPU、小内存(如嵌入式系统)或客户端应用。
- 代偿代价:停顿时间长(秒级),无法利用多核性能。
ParNew收集器
- 特点:Serial的多线程版本,仅用作新生代,需与CMS收集器配合使用。
- 适用场景:多核服务器中需与CMS搭配的场景(如JDK8前)。
- 限制:JDK9后逐渐被废弃,与CMS的兼容性要求高。
Parallel Scavenge(吞吐量收集器)
- 特点:多线程并行回收,以最大化吞吐量为目标,支持自适应调节策略(如动态调整堆分区比例)。
- 适用场景:后台计算型任务(如数据批处理)。
- 代偿代价:牺牲单次停顿时间(可达数百毫秒)。
CMS(Concurrent Mark-Sweep)
- 特点:并发标记清除,分四阶段(初始标记->并发标记->重新标记->并发清除),仅部分阶段STW。
- 适用场景:延迟敏感的Web服务(如电商系统)
- 缺陷:内存碎片(需定期Full GC整理)、高CPU占用。
全堆与低延迟收集器
G1(Garbage-First)
- 特点:将堆划分为多个Region(默认2048个),优先回收垃圾比例高的Region,支持可预测停顿时间。
- 适用场景:大内存(>6GB)服务端应用。
- 优势:平衡吞吐量与延迟,内存碎片率低于CMS。
ZGC(Z Garbage Collector)
- 特点:全并发操作(染色指针技术),亚毫秒级停顿(<10ms),支持TB级别内存。
- 适用场景:实时系统(如金融交易)、超大内存应用。
- 代价:高CPU和内存带宽消耗,小堆性能反而不如G1.
Shenandoan
- 特点:类似ZGC的全并发设计(Brooks指针),低停顿且开源,与ZGC竞争。
- 适用场景:需极低延迟且避免厂商绑定(如云原生环境)。
JVM调优
关键参数模版:
# G1调优模板(Web服务场景)
-Xmx8g -Xms8g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
-XX:ConcGCThreads=4
-XX:G1ReservePercent=10
# ZGC调优模板(低延迟场景)
-Xmx16g -Xms16g
-XX:+UseZGC
-XX:ConcGCThreads=8
-XX:SoftMaxHeapSize=14g
参数类型 | 示例参数 | 作用说明 |
---|---|---|
堆内存分配 | -Xmx4g -Xms4g | 避免堆动态扩容触发Full GC |
GC算法选择 | -XX:+UseG1GC | 指定G1收集器 |
停顿时间控制 | -XX:MaxGCPauseMillis=200 | G1目标最大停顿时间 |
并行GC线程数 | -XX:ParallelGCThreads=4 | 根据CPU核心数调整 |
元空间限制 | -XX:MaxMetaspaceSize=512m | 防止元空间无限增长 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。