Java应用(尤其是银行核心系统)的性能瓶颈有40%以上与JVM配置不当有关——GC停顿是导致P99毛刺的常见根因。掌握GC日志分析和堆内存调优是性能工程师的必修课。
| GC类型 | 适用场景 | 特点 | 停顿时间 |
|---|---|---|---|
| G1 GC | >4GB堆、要求低暂停 | 分区回收、可预测停顿 | 通常<200ms |
| ZGC | 大堆(>16GB)、极低延迟 | 并发回收、暂停<1ms | 亚毫秒级 |
| Parallel GC | 批处理、高吞吐 | 多线程STW | 秒级(Full GC时) |
| Serial GC | 小堆(<1GB) | 单线程 | 秒级 |
银行业推荐:G1 GC(默认)用于大多数场景;ZGC用于要求P99<100ms的核心交易系统。
-Xms -Xmx:堆初始/最大值,建议设为相同大小避免堆扩缩容开销-XX:MaxGCPauseMillis=200:G1目标暂停时间(毫秒)-XX:+PrintGCDetails -XX:+PrintGCDateStamps:开启GC日志-XX:+HeapDumpOnOutOfMemoryError:OOM时自动dump堆操作:压测期间开启GC日志,用GCViewer或gceasy.io分析GC频率、总GC耗时占运行时间的比例。若GC耗时占比>5%且P99出现与GC时间吻合的毛刺,说明GC是瓶颈。
操作:稳定性测试运行8小时后,对比初始和结束时的堆内存占用。若堆内存持续增长不回落(Full GC后仍占用高),则存在内存泄漏。取HeapDump用MAT/Eclipse Memory Analyzer分析。
-XX:MaxMetaspaceSize