我可以从命令行检查正在运行的 JVM 的堆使用情况吗?我指的是实际使用情况,而不是 Xmx 分配的最大数量。
我需要它是命令行,因为我无法访问窗口环境,并且我想要基于 value 的脚本,应用程序在 Jetty Application server 中运行
我可以从命令行检查正在运行的 JVM 的堆使用情况吗?我指的是实际使用情况,而不是 Xmx 分配的最大数量。
我需要它是命令行,因为我无法访问窗口环境,并且我想要基于 value 的脚本,应用程序在 Jetty Application server 中运行
您可以使用 jstat,例如:
jstat -gc pid
完整文档在这里: http ://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html
对于 Java 8,您可以使用以下命令行来获取以 kB 为单位的堆空间利用率:
jstat -gc <PID> | tail -n 1 | awk '{split($0,a," "); sum=a[3]+a[4]+a[6]+a[8]; print sum}'
该命令基本上总结了:
您可能还希望包括元空间和压缩类空间利用率。在这种情况下,您必须将 a[10] 和 a[12] 添加到 awk 总和中。
一次完成所有程序。基于@Till Schäfer 的回答。
在 KB 中...
jstat -gc $(ps axf | egrep -i "*/bin/java *" | egrep -v grep | awk '{print $1}') | tail -n 1 | awk '{split($0,a," "); sum=(a[3]+a[4]+a[6]+a[8]+a[10]); printf("%.2f KB\n",sum)}'
在兆...
jstat -gc $(ps axf | egrep -i "*/bin/java *" | egrep -v grep | awk '{print $1}') | tail -n 1 | awk '{split($0,a," "); sum=(a[3]+a[4]+a[6]+a[8]+a[10])/1024; printf("%.2f MB\n",sum)}'
“Awk 总和”参考:
a[1] - S0C
a[2] - S1C
a[3] - S0U
a[4] - S1U
a[5] - EC
a[6] - EU
a[7] - OC
a[8] - OU
a[9] - PC
a[10] - PU
a[11] - YGC
a[12] - YGCT
a[13] - FGC
a[14] - FGCT
a[15] - GCT
用于“Awk 总和”:
a[3] -- (S0U) Survivor space 0 utilization (KB).
a[4] -- (S1U) Survivor space 1 utilization (KB).
a[6] -- (EU) Eden space utilization (KB).
a[8] -- (OU) Old space utilization (KB).
a[10] - (PU) Permanent space utilization (KB).
[参考: https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html]
谢谢!
注意:适用于 OpenJDK!
进一步的问题:错误的信息?
如果你用ps
命令检查内存使用情况,你会看到java进程消耗更多...
ps -eo size,pid,user,command --sort -size | egrep -i "*/bin/java *" | egrep -v grep | awk '{ hr=$1/1024 ; printf("%.2f MB ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | cut -d "" -f2 | cut -d "-" -f1
更新(2021-02-16):
根据下面的参考资料(和@Till Schäfer 评论)“ps 可以显示操作系统的总保留内存”(改编)和“jstat 可以显示堆和堆栈的已用空间”(改编)。ps
因此,我们看到命令和命令所指出的内容之间存在差异jstat
。
根据我们的理解,最“真实”的信息将是ps
输出,因为我们将对系统内存受损程度做出有效响应。该命令jstat
用于更详细地分析 Java 在消耗 OS 保留内存方面的性能。
[参考: http://www.openkb.info/2014/06/how-to-check-java-memory-usage.html]
如果您在开启 gc 日志记录的情况下开始执行,您将获得存档信息。否则'jmap -heap'会给你你想要的。有关更多信息,请参阅jmap 文档页面。
请注意,除非绝对需要,否则jmap
不应在生产环境中使用它,因为该工具会暂停应用程序以确定实际的堆使用情况。通常这在生产环境中是不需要的。
如果您使用的是 JDK 8 及更高版本,请使用 jcmd:
jcmd <pid> GC.heap_info