Wie kann ich die Größe des Java-Heapspeichers und den verwendeten Speicher ermitteln (Linux)?

Lesezeit: 6 Minuten

Jaspers Benutzeravatar
Jaspis

Wie kann ich die Heap-Größe (und den verwendeten Speicher) einer Java-Anwendung unter Linux über die Befehlszeile überprüfen?

Ich habe es über jmap versucht. Aber es gibt Informationen über interne Speicherbereiche wie Eden, PermGen usw., die für mich nicht nützlich sind.

Ich suche so etwas wie:

  • Maximaler Speicher: 1 GB
  • Mindestspeicher: 256 MB
  • Heap-Speicher: 700 MB
  • Verwendeter Speicher: 460 MB

Das ist alles. Ich weiß, dass ich das sehen kann JConsoleusw., aber ich muss es über die Befehlszeile tun (ich kann es nicht aktivieren JMXusw.)

Benutzeravatar von farmer1992
Bauer1992

Jeder Java-Prozess verfügt über eine piddie Sie zunächst mit dem finden müssen jps Befehl.

Sobald Sie die PID haben, können Sie sie verwenden jstat -gc [insert-pid-here] um Statistiken über das Verhalten des Garbage-Collected-Heaps zu finden.

  • jstat -gccapacity [insert-pid-here] präsentiert Informationen über die Speicherpoolgenerierung und die Speicherplatzmöglichkeiten.

  • jstat -gcutil [insert-pid-here] stellt die Auslastung jeder Generation als Prozentsatz ihrer Kapazität dar. Nützlich, um auf einen Blick einen Überblick über die Nutzung zu erhalten.

Sehen jstat-Dokumente auf der Website von Oracle.

  • Gibt es eine Empfehlung, welche Optionen von jstat sollte man verwenden, um nur die Gesamtspeichernutzung einer JVM zu überprüfen? Nehmen wir an, Sie starten die JVM mit Xms=4g Und Xmx=4g und Sie möchten sehen, wie viel Speicher davon bereits verwendet wird?

    – basZero

    5. Februar 2014 um 9:44

  • „jstat -gcutil 250 N“ war sehr nützlich, um N Stichproben in 250-ms-Intervallen zu erfassen und die Ausgabe als Prozentsätze für die entsprechenden Leerzeichen anzuzeigen. Danke.

    – Kerem

    14. März 2015 um 1:57


  • Bemerkenswertes Zitat von jstat Oracle Java 8-Handbuch Buchseite: This command is experimental and unsupported.

    – patryk.beza

    19. Mai 2015 um 20:20 Uhr


  • awk 'print {$3+$4+$6+$8}' kann eine zusammengefasste Nutzung der JSTAT-Spalten von Java 8 drucken

    – Cybersoft

    1. Februar 2017 um 17:37 Uhr

  • oder awk 'NR>1 {print $3+$4+$6+$8}' um die erste Zeile mit Spaltentiteln zu überspringen

    – Arberg

    4. September 2019 um 9:51 Uhr

Atmas Benutzeravatar
Atma

Dieser Befehl zeigt die konfigurierten Heap-Größen in Bytes an.

java -XX:+PrintFlagsFinal -version | grep HeapSize

Es funktioniert auch auf Amazon AMI auf EC2.

  • Dies beantwortet nicht die Frage, bei der speziell gefragt wird, wie die Heap-Nutzung eines Prozesses überprüft werden soll. Der Befehl hier listet JVM-Standardwerte für alle Prozesse auf.

    – Madbreaks

    30. November 2016 um 17:10 Uhr

  • Für mich ist es jedoch eine sehr hilfreiche Antwort, wenn ich über die Google-Suche auf diese Seite komme, um die globale Heap-Größe zu ermitteln.

    – Johan

    25. Januar 2018 um 13:53

  • @jumping_monkey nicht indirekt, falsch. Wenn das, was Sie sagen, wahr ist, sollte die Antwort bearbeitet werden oder Sie können gerne eine neue Antwort hinzufügen.

    – Madbreaks

    20. Dezember 2019 um 17:58

  • Der Titel der ersten Frage ist so mehrdeutig, dass dies eine aufgelistete Antwort bleiben sollte. Darüber hinaus ist es die am besten auf Google zu findende Antwort auf die Konfigurationsfrage.

    – John Haberstroh

    9. Juni 2021 um 17:46 Uhr


Benutzeravatar von MRalwasser
MRalwasser

jvmtop ist ein Befehlszeilentool, das eine Live-Ansicht verschiedener Metriken, einschließlich Heap, bietet.

Beispielausgabe des VM-Übersichtsmodus:

 JvmTop 0.3 alpha (expect bugs)  amd64  8 cpus, Linux 2.6.32-27, load avg 0.12
 http://code.google.com/p/jvmtop

  PID MAIN-CLASS      HPCUR HPMAX NHCUR NHMAX    CPU     GC    VM USERNAME   #T DL
 3370 rapperSimpleApp  165m  455m  109m  176m  0.12%  0.00% S6U37 web        21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager   11m   28m   23m  130m  0.00%  0.00% S6U37 web        31
19187 m.jvmtop.JvmTop   20m 3544m   13m  130m  0.93%  0.47% S6U37 web        20
16733 artup.Bootstrap  159m  455m  166m  304m  0.12%  0.00% S6U37 web        46

  • Es ist in der Tat ein großartiges Tool, eine Art htop, aber mit Metriken von jstat. Danke für den Vorschlag, @MRalwasser.

    – oski86

    6. Mai 2015 um 20:28

  • Funktioniert aufgrund der tools.jar-Abhängigkeit nur bis Java 8

    – cdalxndr

    21. Januar 2021 um 19:00 Uhr

Benutzeravatar von padippist
Padippist

Versuchen Sie Folgendes, es hat in Ubuntu und RedHat funktioniert:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Für Windows:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Für Mac

java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'

Die Ausgabe aller dieser Befehle ähnelt der folgenden Ausgabe:

uintx InitialHeapSize                          := 20655360        {product}
uintx MaxHeapSize                              := 331350016       {product}
uintx PermSize                                  = 21757952        {pd product}
uintx MaxPermSize                               = 85983232        {pd product}
intx ThreadStackSize                           = 1024            {pd product}
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)

Um die Größe in MB zu ermitteln, dividieren Sie den Wert durch (1024*1024).

Ohne die Verwendung von JMX, was die meisten Tools verwenden, können Sie nur JMX verwenden

jps -lvm

und schließen Sie daraus, dass die Einstellungen aus den Befehlszeilenoptionen stammen.

Ohne JMX können Sie standardmäßig keine dynamischen Informationen abrufen, Sie könnten jedoch Ihren eigenen Dienst schreiben, um dies zu tun.

Übrigens: Ich verwende lieber VisualVM als JConsole.

Benutzer-Avatar von Andrejs
Andrejs

Es gibt ein Befehlszeilentool mit visuellem Aspekt – jvm-mon. Es handelt sich um ein JVM-Überwachungstool für die Befehlszeile, das Folgendes anzeigt:

  • Heap-Nutzung, Größe und max
  • JVM-Prozesse
  • CPU- und GC-Nutzung
  • Top-Threads

Die Metriken und Diagramme werden aktualisiert, während das Tool geöffnet ist.

Probe: jvm-mon

Priyanthas Benutzeravatar
Priyantha

Aus Java8 und höherkönnen Sie den folgenden Befehl verwenden:

jcmd JAVA_PROCESS_ID GC.heap_info

Sie können sich auf die Summe, den gesamten und den verwendeten Speicher aus der Ausgabe beziehen.

Beispielbefehl und -ausgabe: jcmd 9758 GC.heap_info PSYoungGen insgesamt 1579520K, verwendet 487543K [0x0000000751d80000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 1354240K, 36% used [0x0000000751d80000,0x000000076f99dc40,0x00000007a4800000)
  from space 225280K, 0% used [0x00000007b2400000,0x00000007b2400000,0x00000007c0000000)
  to   space 225280K, 0% used [0x00000007a4800000,0x00000007a4800000,0x00000007b2400000)
ParOldGen       total 3610112K, used 0K [0x0000000675800000, 0x0000000751d80000, 0x0000000751d80000)
  object space 3610112K, 0% used [0x0000000675800000,0x0000000675800000,0x0000000751d80000)
Metaspace       used 16292K, capacity 16582K, committed 16896K, reserved 1064960K
  class space    used 1823K, capacity 1936K, committed 2048K, reserved 1048576K

For more details on jcmd command, visit link here

  • You need to correct your comment. GC.heap_info is available in Java 9 and above. It’s not available in the Java 8. See another thread here: stackoverflow.com/questions/41891127/…

    – Pavel Molchanov

    Mar 7, 2019 at 23:01

  • @PavelMolchanov I am able to use the command in jdk1.8.0_172. /Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home/bin/jcmd 98270 GC.heap_info. Please if you may, Add the info to referred thread as well as I don’t have enough reputation as of now to add a comment there.

    – vaibhav gupta

    Mar 19, 2019 at 7:22


  • Do you use Mac? Do you use Oracle JDK? I don’t know how it can be available in your jdk1.8.0_172, Oracle documented this feature only in Java 9 and up: docs.oracle.com/javase/9/tools/jcmd.htm. It’s not in the Oracle JDK documentation for Java 8. It’s not mentioned in the link that you gave at the bottom: docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/…

    – Pavel Molchanov

    Mar 19, 2019 at 15:20

  • One more question. Please check JDK version that is running process 98270 in your example. jcmd gets available commands from JVM of the process (in your case 98270). If process 98270 process is executed with different JDK (JDK 9 or above), you will see GC.heap_info command available even in JCMD itself is from Java 8. Available commands may be different for different processes. To get available commands execute: jcmp <PID> help.

    – Pavel Molchanov

    Mar 19, 2019 at 15:24


  • FWIW, GC.heap_info is definitely available in OpenJDK 8 also. Maybe only in recent versions? I am using this one: 8u191-b12-2ubuntu0.18.04.1

    – Per Lundberg

    Sep 25, 2019 at 10:30


1454380cookie-checkWie kann ich die Größe des Java-Heapspeichers und den verwendeten Speicher ermitteln (Linux)?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy