Gibt es ein Befehlszeilentool (Linux) zum Überprüfen der Heap-Größe (und des verwendeten Speichers) einer Java-Anwendung?
Ich habe es mit jmap versucht. Aber es gibt Infos. über interne Speicherbereiche wie Eden / PermGen usw., was für mich nicht nützlich ist.
Ich suche so etwas wie:
- Maximaler Speicher: 1 GB
- Minimaler Speicher: 256 MB
- Heap-Speicher: 700 MB
- Verwendeter Speicher: 460 MB
Das ist alles. Ich weiß, dass ich dies in JConsole usw. sehen kann, aber ich benötige ein Befehlszeilentool (kann JMX usw. nicht aktivieren).
Kennen Sie ein solches Werkzeug / einen solchen Befehl?
jstat
sollten, um nur die Gesamtspeicherauslastung einer JVM zu überprüfen? Angenommen, Sie starten die JVM mitXms=4g
undXmx=4g
möchten sehen, wie viel Speicher davon bereits verwendet wird.jstat
Oracle Java 8 Handbuch Seite :This command is experimental and unsupported
.awk 'print {$3+$4+$6+$8}'
kann eine zusammengefasste Verwendung in den jstat-Spalten von Java 8 druckenps -ef | grep java
zeigte mir die VM-Argumente, die in meinem Fall den -Xmx-Wert enthielten, was alles war, was ich brauchte.jvmtop ist ein Befehlszeilentool, das eine Live-Ansicht mit verschiedenen Metriken, einschließlich Heap, bietet.
Beispielausgabe des VM-Übersichtsmodus:
quelle
Dieser Befehl zeigt die konfigurierten Heap-Größen in Bytes an.
Es funktioniert auch mit Amazon AMI auf EC2.
quelle
Versuchen Sie dies, es funktionierte in Ubuntu und RedHat:
Für Windows:
Für Mac
Die Ausgabe all dieser Befehle ähnelt der folgenden Ausgabe:
Teilen Sie den Wert durch (1024 * 1024), um die Größe in MB zu ermitteln.
quelle
jstat -gc <vmid>
zum Ausführen von Anwendungen.Ohne JMX, wie es die meisten Tools verwenden, können Sie es nur verwenden
und schließen Sie, dass die Einstellungen aus den Befehlszeilenoptionen stammen.
Ohne JMX können Sie standardmäßig keine dynamischen Informationen abrufen, aber Sie können dazu Ihren eigenen Dienst schreiben.
Übrigens: Ich bevorzuge VisualVM anstelle von JConsole.
quelle
Es gibt ein Kommandozeilen-Tool mit einem visuellen Aspekt - jvm-mon . Es ist ein JVM-Überwachungstool für die Befehlszeile, das nicht mehr funktioniert:
Die Metriken und Diagramme werden aktualisiert, während das Tool geöffnet ist.
Stichprobe:
quelle
Spät auf der Party, aber eine sehr einfache Lösung ist die Verwendung des Skripts jpsstat.sh. Es bietet einen einfachen Live- Stromspeicher , maximalen Speicher und Details zur CPU-Nutzung .
Hier ist die Beispielausgabe des Skripts -
quelle
In meinem Fall musste ich die Flags in einem Docker-Container überprüfen, der nicht über die meisten grundlegenden Dienstprogramme verfügte (ps, pstree ...).
Mit habe
jps
ich die PID der JVM ausgeführt (in meinem Fall 1) und dann mit habejcmd 1 VM.flags
ich die Flags von der laufenden JVM erhalten.Es hängt davon ab, welche Befehle Ihnen zur Verfügung stehen, aber dies kann jemandem helfen. :) :)
quelle
Ab Java8 können Sie den folgenden Befehl verwenden:
jcmd
JAVA_PROCESS_ID
GC.heap_infoSie können sich auf die Summe des gesamten und des verwendeten Speichers der Ausgabe beziehen.
Weitere Informationen zum Befehl jcmd finden Sie unter folgendem Link: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html
quelle
GC.heap_info
ist definitiv auch in OpenJDK 8 verfügbar. Vielleicht nur in neueren Versionen? Ich benutze dieses: 8u191-b12-2ubuntu0.18.04.1Jeder Ansatz sollte Ihnen ungefähr die gleiche Anzahl geben. Es ist immer eine gute Idee, den Heap
-X..m
-X..x
für alle Generationen zuzuweisen . Sie können dann garantieren und auch ps ausführen, um zu sehen, welche Parameter übergeben wurden und daher verwendet werden.Für die tatsächliche Speichernutzung können Sie VIRT (zugewiesen und gemeinsam genutzt) und RES (tatsächlich verwendet) grob mit den jstat-Werten vergleichen:
Für Java 8 siehe jstat, denn diese Werte bedeuten tatsächlich. Angenommen, Sie führen eine einfache Klasse ohne mmap- oder Dateiverarbeitung aus.
Max :
(ungefähr in der Nähe und unterhalb des VIRT-Speichers)
Max (Min, Gebraucht):
(ungefähr in der Nähe des RES-Speichers)
"Zitiere mich nicht dazu", aber VIRT mem liegt ungefähr in der Nähe des zugewiesenen maximalen Speichers oder darüber, aber solange der verwendete Speicher im physischen Speicher frei / verfügbar ist, löst JVM keine Speicherausnahme aus. Tatsächlich wird der maximale Speicher beim JVM-Start nicht einmal mit dem physischen Speicher verglichen, selbst wenn das Betriebssystem ausgeschaltet ist. Eine bessere Erklärung dessen, was der virtuelle Speicher tatsächlich von einem Java-Prozess verwendet, wird hier erläutert .
quelle
Holen Sie sich zuerst die Prozess-ID, die erste Nummer aus dem aufgelisteten Prozess, aus einer der folgenden Quellen: (oder verwenden
ps aux | grep java
Sie einfach , wenn Sie dies bevorzugen)Verwenden Sie dann hier die Prozess-ID:
quelle
Die Verwendung eines
top
Befehls ist der einfachste Weg, um die Speichernutzung des Programms zu überprüfen.RES
Die Spalte zeigt den realen physischen Speicher, der von einem Prozess belegt wird.Für meinen Fall hatte ich eine 10g-Datei in Java gelesen und jedes Mal, wenn ich eine Ausnahme von outOfMemory bekam. Dies geschah, als der Wert in der
RES
Spalte den in der-Xmx
Option festgelegten Wert erreichte . Durch Erhöhen des Speichers mit der-Xmx
Option ging dann alles in Ordnung.quelle
In Bezug auf die Größe des Java-Heapspeichers können Sie unter Linux verwenden
oder
Suchen Sie nach -Xms, -Xmx, um die angegebene anfängliche und maximale Heap-Größe zu ermitteln.
Wenn jedoch -Xms oder -Xmx für den Java-Prozess, an dem Sie interessiert sind, nicht vorhanden ist, bedeutet dies, dass Ihr Java-Prozess die Standard-Heap-Größen verwendet. Mit dem folgenden Befehl können Sie die Standardgrößen ermitteln.
oder ein bestimmtes jvm zum Beispiel
und suchen Sie nach InitialHeapSize und MaxHeapSize, die in Bytes angegeben sind.
quelle
Wenn Sie jrockit verwenden, versuchen Sie es mit dem Befehlszeilentool jrcmd. Beispielsweise:
Verwenden Sie für weitere Befehle wie heap_diagnostics "jrcmd help", um sie aufzulisten.
https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t
quelle
Beispiel-O / P des obigen Befehls
Weitere Informationen hierzu finden Sie unter http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
quelle
Es gibt kein solches Werkzeug bis jetzt den Heap - Speicher in dem Format zu drucken , wie Sie verlangten Den einzigen und einzigen Weg , um Druck ein Java - Programm mit Hilfe von Laufzeit - Klasse zu schreiben ist ,
}}
Referenz: https://viralpatel.net/blogs/getting-jvm-heap-size-used-memory-total-memory-using-java-runtime/
quelle
Suchen Sie die Prozess-ID Ihres Webapp / Java-Prozesses von oben. Verwenden Sie jmap heap, um die Heap-Zuordnung abzurufen. Ich habe dies auf AWS-Ec2 auf elastische Bohnenstange getestet
Sie können im Bild unten maximal 3 GB Heap für die Anwendung sehen
quelle