You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:38:19