如何仅通过添加JVM参数获取Java运行时内存信息?
JDK8及以上版本无侵入获取短生命周期应用堆内存指标方案
以下方案完全匹配要求:
- 不依赖jmap、jcmd等需要传入进程PID的外部诊断工具
- 不需要修改应用任何源代码,无代码侵入
- 所有能力仅通过JVM启动参数开启,应用启动后不需要额外运行时操作
推荐方案:内置Java Flight Recorder(JFR)
JFR是JDK官方内置的低开销诊断组件,是hprof被移除后的官方替代能力,从JDK8u40版本开始内置支持,JDK9及以上版本为正式可用功能,完美适配短生命周期应用场景。
启动时添加如下参数即可:
java -XX:StartFlightRecording:filename=heap_stats.jfr,dumponexit=true,settings=default -jar 你的应用jar包
参数说明:
dumponexit=true:配置JVM在应用正常退出时自动导出全周期运行记录,全程不需要在应用运行期间执行任何外部诊断命令,也不需要感知进程PID,所有采集、导出动作由JVM自动完成,适配短生命周期应用运行完自动退出的特性filename=heap_stats.jfr:指定导出的记录文件存储路径settings=default:使用默认低开销采集配置,堆内存相关的已提交大小、使用量峰值指标默认就会采集,额外性能开销低于2%,不会影响应用正常运行
应用运行结束后,直接读取生成的jfr文件,即可提取整个运行周期内的JVM堆已提交(committed)内存大小、堆内存实际使用量峰值数据。
轻量替代方案:GC日志输出内存统计
如果不想解析JFR二进制文件,可直接开启GC日志打印堆内存统计,应用运行过程中会持续输出堆内存变化,遍历日志即可统计出全周期堆内存峰值,启动参数如下:
- JDK9及以上版本:
java -Xlog:gc*=info:file=heap_gc.log:time,tags -jar 你的应用jar包
- JDK8版本:
java -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:heap_gc.log -jar 你的应用jar包
日志中会记录每次GC后的堆已提交内存、已使用内存数值,提取所有记录中的最大值即可得到运行期峰值。
注:以上所有参数均为JDK官方内置能力,不需要依赖任何第三方组件,启动时配置一次即可生效。
内容的提问来源于stack exchange,提问作者Miao
相关产品推荐
相关产品推荐

