Java 17/21中替代PrintClassHistogram(Before|After)FullGC的垃圾分析方案
Java 17/21 找出占比最大垃圾贡献类的替代方法
在Java 17及之后版本中,原有的-XX:+PrintClassHistogramBeforeFullGC和-XX:+PrintClassHistogramAfterFullGC参数已被移除,可通过以下几种更灵活的方式分析垃圾贡献类:
1. 用jcmd工具手动/半自动对比
jcmd是JDK自带的多功能诊断工具,无需启动时配置参数,随时可以获取堆的类直方图:
- 获取当前堆类统计:
jcmd <进程PID> GC.class_histogram - 触发FullGC:
jcmd <进程PID> GC.run_full_gc - 操作流程:先执行一次
GC.class_histogram记录FullGC前的状态,触发FullGC后再执行一次,对比两次结果中实例数/内存占用减少最多的类,这类就是主要的垃圾贡献者。
2. Java Flight Recorder (JFR) 全链路分析
JFR是低开销的内置性能分析工具,能精准追踪GC相关的类回收情况:
- 启动时开启录制:
java -XX:StartFlightRecording=filename=gc_analysis.jfr,duration=10m <你的主类> - 动态开启录制(进程已启动):
jcmd <进程PID> JFR.start filename=gc_analysis.jfr duration=10m - 分析方式:用JDK自带的JDK Mission Control (JMC)打开录制文件,在垃圾回收视图中可直接查看各类的实例分配量、回收量及内存占比;也可用命令行分析:
jfr analyze --events GarbageCollection,ClassLoading gc_analysis.jfr,筛选出回收占比高的类。
3. jmap工具生成类直方图
jmap的-histo选项仍可用于生成类统计信息,用法类似jcmd:
- 生成当前堆类直方图:
jmap -histo <进程PID> - 同样可以在FullGC前后各执行一次,通过对比两次输出的差异,定位垃圾贡献大的类。
4. 自定义JMX监听自动化分析
如果需要集成到监控系统中,可通过JMX实现FullGC前后的自动统计:
- 注册
GCNotificationListener监听FullGC事件 - 在事件触发前、后分别通过
ManagementFactory.getMemoryMXBean()和ClassLoadingMXBean获取类的内存与实例统计,自行处理对比逻辑,输出垃圾贡献占比高的类。
内容的提问来源于stack exchange,提问作者Harald
相关产品推荐
相关产品推荐

