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

Pau*_*lor 38 java garbage-collection memory-management jetty jvisualvm

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

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

Mar*_*ark 56

您可以使用jstat,例如:

 jstat -gc pid
Run Code Online (Sandbox Code Playgroud)

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

  • @PaulTaylor您想要EU和OU列 - 添加它们会为您提供所使用的堆的数量.添加EC和OC列可为您分配堆. (5认同)
  • 所以我认为OU是关键列,OC显示分配的最大值 (2认同)

Til*_*fer 16

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

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

该命令基本总结如下:

  • S0U:幸存者空间0利用率(kB).
  • S1U:幸存者空间1利用率(kB).
  • 欧盟:伊甸园空间利用率(kB).
  • OU:旧空间利用率(kB).

您可能还希望包括元空间和压缩类空间利用率.在这种情况下,你必须在awk总和中添加[10]和[12].


Edu*_*cio 10

一次完成所有程序。基于@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)}'
Run Code Online (Sandbox Code Playgroud)

在 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)}'
Run Code Online (Sandbox Code Playgroud)

“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
Run Code Online (Sandbox Code Playgroud)

用于“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).
Run Code Online (Sandbox Code Playgroud)

[参考: 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
Run Code Online (Sandbox Code Playgroud)

更新(2021-02-16):

根据下面的参考(和@Till Schäfer 评论)“ps 可以显示 OS 的总保留内存”(改编)和“jstat 可以显示堆和堆栈的已用空间”(改编)。因此,我们看到ps命令和jstat命令指出的内容之间存在差异。

根据我们的理解,最“真实”的信息将是ps输出,因为我们将对系统内存有多少受到损害有一个有效的反应。该命令jstat用于更详细地分析操作系统保留内存消耗中的 Java 性能。

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

  • 关于您的问题: ps 显示分配的系统内存而不是堆使用情况。因此,java 可能会分配未使用的内存。 (2认同)

Eri*_*rik 8

如果您在启用gc日志记录的情况下开始执行,则会获取文件信息.否则'jmap -heap'会给你你想要的.有关更多信息,请参阅jmap doc页面.

请注意,jmap应该不是在生产环境中使用,除非绝对必要的工具停止应用程序能够确定实际的堆使用.通常在生产环境中不需要这样做.