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

Java 如何从命令行检查正在运行的JVM的堆使用情况?,java,memory-management,garbage-collection,jetty,jvisualvm,Java,Memory Management,Garbage Collection,Jetty,Jvisualvm,我可以从命令行检查正在运行的JVM的堆使用情况吗,我指的是实际使用情况,而不是Xmx分配的最大数量 我需要命令行,因为我没有访问窗口环境的权限,我需要基于值的脚本,应用程序正在Jetty application server中运行,您可以使用jstat,如: jstat -gc pid 完整文档在此: 如果在打开gc日志记录的情况下开始执行,则会在文件中获取信息。 否则,“jmap-heap”将提供您想要的。 有关更多信息,请参阅 请注意,jmap不应在生产环境中使用,除非绝对需要,因为该工

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


我需要命令行,因为我没有访问窗口环境的权限,我需要基于值的脚本,应用程序正在Jetty application server中运行,您可以使用jstat,如:

 jstat -gc pid
完整文档在此:

如果在打开gc日志记录的情况下开始执行,则会在文件中获取信息。 否则,“jmap-heap”将提供您想要的。 有关更多信息,请参阅


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

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

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

所有过程同时进行。基于@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)}'
以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]); 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 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
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).
用于“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
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

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如果使用JDK 8及以上版本,请使用jcmd:


jcmdGC.heap\u info

谢谢你看起来像我想要的,可能需要一段时间才能理解所有选项,不过,我基本上是在寻找堆的使用量,所以我认为OU是关键列,OC显示了最大使用量allocated@PaulTaylor您需要EU和OU列—将它们相加可以得到堆的数量使用t。将EC和OC列相加可以得到分配给堆的数量。如果jvm作为一个linux用户运行,而您作为另一个linux用户登录,您如何做到这一点?为什么还要对YGCT求和?现在是关于您的问题的时间:ps显示分配的系统内存,而不是堆的使用情况。因此,java可能会分配未使用的内存java pid retreaval不适用于多个java进程。最好在$(ps-o pid=-C java)中对pid执行
;执行[…]完成
或使用
jps-m
@TillSchäfer我不太明白您所说的
$(ps-o pid=-C java)是什么意思;执行[…]完成
…你能给我们一个完整的例子来说明你想解释什么吗?这样我可以进一步丰富我的答案。谢谢=D@Gamby调整好了!谢谢