有没有办法通过添加 JVM args 来打印 Java 运行时内存信息

Posted

技术标签:

【中文标题】有没有办法通过添加 JVM args 来打印 Java 运行时内存信息【英文标题】:Is there any way to print Java runtime memory infomation by adding JVM args 【发布时间】:2022-01-22 16:56:42 【问题描述】:

我想获取 JVM 提交的堆大小和实际使用量(峰值)。申请时间短。 有没有办法获取内存信息:

    不使用 jmap, jcmd, ...(需要 pid) 不修改源代码(例如插入:Runtime.getRuntime() ...) 只需将参数传递给 JVM java -X:someargs ...

似乎在 jdk1.8 java -agentlib:hprof=heap 之前可以提供帮助,但是 hprof 被删除了。

【问题讨论】:

您可以配置 JVM 以在 GC 运行时打印出 GC 统计信息,但如果没有 1. 或 2,您可以做的只有 AFAIK。 顺便问一下……获取 JVM 的 pid 有什么困难? psjps 命令会告诉你它是什么。 @StephenC 谢谢你的建议~对于那些短时间的程序(非常快完成),我想执行这个'fetch pid & dump heap'并不容易。 【参考方案1】:

JDK 8

-XX:+PrintGCDetails

堆布局和使用情况将在 VM 退出时打印:

 PSYoungGen      total 443904K, used 283177K [0x00000000dcc00000, 0x00000000f7f00000, 0x0000000100000000)
  eden space 442368K, 63% used [0x00000000dcc00000,0x00000000ee07a6f8,0x00000000f7c00000)
  from space 1536K, 4% used [0x00000000f7d80000,0x00000000f7d90000,0x00000000f7f00000)
  to   space 1536K, 0% used [0x00000000f7c00000,0x00000000f7c00000,0x00000000f7d80000)
 ParOldGen       total 72704K, used 980K [0x0000000096400000, 0x000000009ab00000, 0x00000000dcc00000)
  object space 72704K, 1% used [0x0000000096400000,0x00000000964f5060,0x000000009ab00000)
 Metaspace       used 4568K, capacity 4718K, committed 4992K, reserved 1056768K
  class space    used 472K, capacity 532K, committed 640K, reserved 1048576K

JDK 9+

-Xlog:gc+heap+exit

[9.405s][info][gc,heap,exit]  garbage-first heap   total 276480K, used 149668K [0x0000000700000000, 0x0000000800000000)
[9.405s][info][gc,heap,exit]   region size 1024K, 147 young (150528K), 1 survivors (1024K)
[9.405s][info][gc,heap,exit]  Metaspace       used 6335K, capacity 6395K, committed 6784K, reserved 1056768K
[9.405s][info][gc,heap,exit]   class space    used 511K, capacity 530K, committed 640K, reserved 1048576K

total 是提交的内存;范围[0x0000000700000000, 0x0000000800000000) 是保留空间。

如果您想在每次 GC 时而不是在 VM 退出时打印堆,请使用 -XX:+PrintHeapAtGC 在 JDK 8 中,或 -Xlog:gc+heap=debug 在 JDK 9+ 中。

【讨论】:

谢谢你的回答,我会试试的!日志是总结了整个程序的整体堆内存信息,(我的意思是峰值)还是只是它退出时的状态? @Miao 退出时,不是峰值

以上是关于有没有办法通过添加 JVM args 来打印 Java 运行时内存信息的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法通过命令行将 JVM 参数传递给 Maven? [复制]

有没有办法通过不删除和添加 ItemsSource 来更新 ListBox 的项目? [关闭]

有没有办法通过向父级添加内联样式来隐藏父级 div/容器内的所有 div?

有没有办法将颜色点链接到具有不同图例的字典?

jni创建jvm失败

性能测试常见问题