如何检查在命令行中运行的JVM的堆的使用情况?(How to check heap usage of

2019-07-18 13:00发布

我可以查看正在运行的JVM的堆使用从命令行,我指的是实际使用,而不是与XMX分配的最大金额。

我需要它的命令行,因为我没有获得一个窗口环境,我想基于价值的脚本,应用程序在码头的应用服务器上运行

Answer 1:

您可以使用jstat,如:

 jstat -gc pid

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



Answer 2:

对于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)。
  • 欧盟:伊甸园的空间利用率(KB)。
  • OU:老空间利用率(KB)。

您可能还需要包括元空间和压缩类空间利用率。 在这种情况下,你必须添加一个[10]和[12]对AWK总和。



Answer 3:

如果你开始执行的GC日志记录功能后,您获得文件信息。 否则,“JMAP -heap”会给你想要的东西。 见JMAP文档页面为多。

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



Answer 4:

所有程序一次。 基于@Till舍费尔的答案。

在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]+a[12]; print 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]+a[12])/1024; print sum" MB"}'

“在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

谢谢!

注:工作到OpenJDK的!

进一步的问题:错误的信息?

如果您检查与内存使用ps命令,你会看到,Java进程消耗更多...

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |cut -d "" -f2 | cut -d "-" -f1


文章来源: How to check heap usage of a running JVM from the command line?