如何从命令行检查正在运行的 JVM 的堆使用情况?

问题描述 投票:0回答:5

我可以从命令行检查正在运行的 JVM 的堆使用情况吗?我的意思是实际使用情况,而不是使用 Xmx 分配的最大数量。

我需要它是命令行,因为我无权访问窗口环境,并且我想要基于值的脚本,应用程序在 Jetty 应用程序服务器中运行

java memory-management garbage-collection jetty jvisualvm
5个回答
67
投票

您可以使用 jstat,例如:

 jstat -gc pid

完整文档在这里: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html


21
投票

对于 Java 8,您可以使用以下命令行来获取堆空间利用率(以 kB 为单位):

jstat -gc <PID> | tail -n 1 | awk '{split($0,a," "); sum=a[3]+a[4]+a[6]+a[8]; print sum}'

该命令基本上总结如下:

  • S0U:幸存者空间0利用率(kB)。
  • S1U:幸存者空间1利用率(kB)。
  • EU:Eden 空间利用率(kB)。
  • OU:旧空间利用率(kB)。

您可能还想包括元空间和压缩类空间利用率。在这种情况下,您必须将 a[10] 和 a[12] 添加到 awk sum 中。


13
投票

所有程序一次完成。基于@Till Schäfer 的回答。

知识库...

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)}'

MB...

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 sum”参考:

 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 sum”:

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 在操作系统保留内存消耗方面的性能。

[参考: http://www.openkb.info/2014/06/how-to-check-java-memory-usage.html]


9
投票

如果您在打开 gc 日志记录的情况下开始执行,您将获得文件中的信息。 否则“jmap -heap”会给你你想要的。 请参阅 jmap 文档页面了解更多信息。

请注意,

jmap
不应该在生产环境中使用,除非绝对需要,因为该工具会停止应用程序以确定实际的堆使用情况。通常这在生产环境中是不需要的。


4
投票

jcmd < pid > GC.heap_info

© www.soinside.com 2019 - 2024. All rights reserved.