it-swarm.com.de

Wie kann ich die Auslastung einer laufenden JVM von der Befehlszeile aus überprüfen?

Kann ich die Heap-Nutzung einer laufenden JVM von der Kommandozeile aus überprüfen, meine ich die tatsächliche Nutzung und nicht den mit Xmx zugewiesenen Höchstbetrag.

Ich brauche es als Kommandozeile, weil ich keinen Zugriff auf eine Windowing-Umgebung habe und ein Skript basierend auf dem Wert möchte, dass die Anwendung auf dem Jetty Application Server ausgeführt wird 

36
Paul Taylor

Sie können jstat verwenden, wie: 

 jstat -gc pid

Vollständige Dokumente hier: http://docs.Oracle.com/javase/7/docs/technotes/tools/share/jstat.html

52
Mark

Für Java 8 können Sie die folgende Befehlszeile verwenden, um die Heap-Speicherauslastung in kB abzurufen:

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

Der Befehl fasst im Wesentlichen zusammen:

  • S0U: Nutzung des Überlebensraumes 0 (kB).
  • S1U: Nutzung des Survivor Space 1 (kB).
  • EU: Raumnutzung in Eden (kB).
  • OU: Alte Speicherplatznutzung (KB).

Möglicherweise möchten Sie auch den Metaspace und die komprimierte Klassenraumnutzung einschließen. In diesem Fall müssen Sie der awk-Summe eine [10] und eine [12] hinzufügen.

14
Till Schäfer

Wenn Sie die Ausführung mit gc-Protokollierung starten, erhalten Sie die Informationen zur Datei . Andernfalls erhalten Sie mit jmap -heap das, was Sie möchten . Weitere Informationen finden Sie auf der Seite jmap doc .

Beachten Sie, dass jmap in einer Produktionsumgebung not nicht verwendet werden sollte, es sei denn, dies ist absolut erforderlich, da das Tool die Anwendung anhält, um die tatsächliche Heap-Nutzung bestimmen zu können. Normalerweise ist dies in einer Produktionsumgebung nicht erwünscht.

8
Erik

Alle Prozedur auf einmal. Basierend auf der Antwort von @Till Schäfer.

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

In 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-Summe" Referenz:

 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

Vielen Dank!

HINWEIS: Arbeitet mit OpenJDK!

WEITERE FRAGE: Falsche Angaben?

Wenn Sie die Speichernutzung mit dem Befehl ps überprüfen, werden Sie feststellen, dass der Java-Prozess viel mehr verbraucht.

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
0
Eduardo Lucio