【Java面试笔记:进阶】28.谈谈你的GC调优思路?
在JVM的GC调优中,没有放之四海而皆准的方案,需要结合业务场景、硬件资源和GC特性进行系统性分析。
1.GC调优的基本思路
1.明确调优目标
- 内存效率(Footprint):减少JVM的内存占用(如边缘设备部署)。
- 低延迟(Latency):降低GC导致的停顿时间(如API网关要求99.9%请求延迟<50ms)。
- 高吞吐量(Throughput):提高应用的整体性能。容忍较长停顿,但要求单位时间处理更多请求(如离线计算任务)。
- 其他目标:如避免OOM(OutOfMemoryError)、优化应用启动速度等。
案例矛盾点
某支付系统同时要求:
- 交易峰值时延<100ms(低延迟优先)
- 日终批量对账任务2小时内完成(高吞吐量)
解决方案:
- 交易服务使用ZGC(亚毫秒级停顿)
- 批处理任务使用Parallel GC(吞吐量优先)并通过-XX:+UseParallelGC独立进程运行
2.理解应用需求和问题
- 评估用户可接受的响应时间和业务量。
- 确定是否需要进行GC调优。
3.掌握JVM和GC的状态
- 使用工具(如jstat、jmap)或开启GC日志来监控GC状态。
- 分析GC日志,查找长时间的GC暂停。
1. 核心监控指标
| 指标 | 采集工具 | 健康阈值(示例) | 
|---|---|---|
| GC停顿时间占比 | jstat -gcutil | <1%(低延迟场景) | 
| Full GC频率 | GC日志分析 | 日均≤3次 | 
| 堆内存使用率 | Prometheus + JMX Exporter | 峰值<80%配置容量 | 
| 元空间增长速率 | jstat -gcmetacapacity | 类加载速率<100个/分钟 | 
2. GC日志关键分析
启用GC日志并解析关键事件:
# 启用基础GC日志
-Xlog:gc*:file=gc.log:time:filecount=10,filesize=50M
# G1详细日志(诊断Mixed GC问题)
-Xlog:gc+ergo*=debug,gc+