web-dev-qa-db-ja.com

コマンドラインから実行中のJVMのヒープ使用量を確認する方法は?

実行中のJVMのヒープ使用量をコマンドラインから確認できますか。Xmxで割り当てられた最大量ではなく、実際の使用量を意味します。

ウィンドウ環境にアクセスできないため、コマンドラインである必要があり、値に基づいてスクリプトが必要で、アプリケーションはJettyアプリケーションサーバーで実行されています

38
Paul Taylor

次のようにjstatを使用できます。

 jstat -gc pid

完全なドキュメントはこちら: http://docs.Oracle.com/javase/7/docs/technotes/tools/share/jstat.html

56
Mark

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)。

メタスペースと圧縮されたクラススペースの使用率を含めることもできます。この場合、awk sumにa [10]とa [12]を追加する必要があります。

16
Till Schäfer

Gcロギングをオンにして実行を開始すると、ファイルに関する情報が得られます。それ以外の場合、「jmap -heap」は必要なものを提供します。詳細については、 jmap doc page をご覧ください。

jmapは、ツールが実際の決定を可能にするためにアプリケーションを停止するために絶対に必要でない限り、実稼働環境ではnotを使用すべきではないことに注意してくださいヒープ使用量。通常、これは実稼働環境では望ましくありません。

8
Erik

すべての手順を一度に。 @TillSchä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]+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 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

ありがとう!

注: 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
3
Eduardo Lucio