GC 日志分析
1. GC 日志分析指南
1.1 GC 日志配置参数
GC日志基础配置
-XX:+PrintGCDetails # 打印详细GC日志
-XX:+PrintGCDateStamps # 打印GC时间戳
-XX:+PrintGCTimeStamps # 打印GC时间间隔
-Xloggc:/path/to/gc.log # GC日志输出路径
-XX:+PrintHeapAtGC # 打印GC前后的堆内存信息
-XX:+PrintGCApplicationStoppedTime # 打印应用暂停时间
-XX:+PrintGCApplicationConcurrentTime # 打印应用运行时间
1.2 GC 日志格式解析
1.2.1 Young GC日志示例
2024-03-20T10:44:23.876+0800: 2.870: [GC (Allocation Failure)
[PSYoungGen: 33280K->4880K(38400K)] 33280K->5008K(125952K), 0.0036685 secs]
[Times: user=0.02 sys=0.00, real=0.00 secs]
日志解析:
2024-03-20T10:44:23.876+0800: GC发生的时间2.870: JVM启动后经过的秒数PSYoungGen: 使用的垃圾收集器(这里是Parallel Scavenge)33280K->4880K(38400K): 年轻代GC前后的内存变化,括号内是总容量33280K->5008K(125952K): 整个堆内存GC前后的变化,括号内是总容量0.0036685 secs: GC耗时
1.2.2 Full GC日志示例
2024-03-20T10:45:23.876+0800: 62.870: [Full GC (Metadata GC Threshold)
[PSYoungGen: 10080K->0K(38400K)] [ParOldGen: 86K->86K(87552K)]
10167K->86K(125952K), [Metaspace: 20456K->20456K(1067008K)], 0.01356 secs]
[Times: user=0.06 sys=0.00, real=0.01 secs]
日志解析:
Full GC: 表示进行了完整的垃圾收集Metadata GC Threshold: GC触发原因PSYoungGen: 年轻代的内存变化ParOldGen: 老年代的内存变化Metaspace: 元空间的内存变化
1.3 GC日志分析工具
1.3.1 GCViewer
- 开源的GC日志分析工具
- 提供图形化界面
- 主要功能:
- GC事件可视化
- 内存使用趋势分析
- GC暂停时间统计
- 吞吐量计算
1.3.2 GCEasy
- 在线GC日志分析工具
- 主要特点:
- 自动识别GC类型
- 提供详细的统计报告
- 内存泄漏检测
- 性能建议
1.4 GC日志分析要点
1.4.1 关键指标
-
吞吐量
- 计算公式:(总运行时间 - 总暂停时间) / 总运行时间
- 建议值:99% 以上
-
暂停时间
- Minor GC: 建议小于50ms
- Full GC: 建议小于1s
- 关注最大暂停时间和平均暂停时间
-
内存使用
- 堆内存使用率
- 各代内存变化趋势
- GC频率
1.4.2 常见问题分析
- 频繁的Young GC
- 现象:Young GC频率过高
- 可能原因:
- 新生代空间不足
- 对象创建速率过高
- 解决方案:
- 增加新生代大小
- 优化对象创建
-Xmn2g # 增加新生代大小
- 频繁的Full GC
- 现象:Full GC频率过高
- 可能原因:
- 老年代空间不足
- 内存泄漏
- 大对象直接进入老年代
- 解决方案:
- 增加老年代大小
- 排查内存泄漏
- 调整大对象阈值
-XX:PretenureSizeThreshold=3145728 # 设置大对象阈值为3MB
1.5 GC日志分析实战
1.5.1 分析步骤
- 收集完整GC日志
- 统计GC频率和时间
- 分析内存使用趋势
- 识别异常模式
- 制定优化方案
1.5.2 优化建议
- 调整内存分配
-Xms4g
-Xmx4g
-Xmn1.5g
-XX:SurvivorRatio=8
- 调整GC触发时机
G1收集器示例配置
-XX:InitiatingHeapOccupancyPercent=45 # 设置触发混合垃圾回收的阈值
-XX:G1HeapRegionSize=16m # 设置Region大小
- 优化GC性能
并行GC线程数配置
-XX:ParallelGCThreads=4 # 并行GC线程数
-XX:ConcGCThreads=2 # 并发GC线程数
1.6 GC日志监控预警
- 设置监控指标
- GC频率
- GC持续时间
- 内存使用率
- Full GC次数
- 告警阈值设置
示例告警条件
Full GC频率 > 1次/小时
单次GC暂停时间 > 1秒
堆内存使用率 > 85%
- 监控工具
- Prometheus + Grafana
- VisualVM
- JConsole
851

被折叠的 条评论
为什么被折叠?



