Gibt es ein Befehlszeilentool (Linux) zum Überprüfen der Heap-Größe (und des verwendeten Speichers) einer Java -Anwendung?
Ich habe jmap ausprobiert Aber es gibt Infos. über interne Speicherbereiche wie Eden/PermGen usw., was mir nicht nützlich ist.
Ich suche etwas wie:
Maximaler Arbeitsspeicher: 1 GB
Mindestspeicher: 256 MB
Heapspeicher: 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).
Ein solches Werkzeug/Befehl?
Jeder Java Prozess hat einen pid
, den Sie zuerst mit dem jps
Befehl finden müssen.
Sobald Sie die PID haben, können Sie jstat -gc [insert-pid-here]
verwenden, um Statistiken über das Verhalten des Heaps mit gesammelten Speicherbereinigungen zu erhalten.
jstat -gccapacity [insert-pid-here]
zeigt Informationen zur Speicherpoolgenerierung und zu Speicherplatzkapazitäten an.
jstat -gcutil [insert-pid-here]
zeigt die Auslastung jeder Generation als Prozentsatz ihrer Kapazität an. Nützlich, um einen Überblick über die Verwendung zu erhalten.
Siehe jstat docs auf der Oracle-Site.
jvmtop ist ein Befehlszeilentool, das eine Live-Ansicht mit mehreren Metriken, einschließlich Heap, bietet.
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
Dieser Befehl zeigt die konfigurierten Heap-Größen in Bytes an.
Java -XX:+PrintFlagsFinal -version | grep HeapSize
Es funktioniert auch mit Amazon AMI auf EC2.
Versuchen Sie dies, es funktionierte in Ubuntu und RedHat:
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 all 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)
Teilen Sie den Wert durch (1024 * 1024), um die Größe in MB zu ermitteln.
Ohne JMX, wie es die meisten Tools verwenden, können Sie nur JMX verwenden
jps -lvm
und schließen Sie daraus, dass die Einstellungen über die Befehlszeilenoptionen vorgenommen werden.
Ohne JMX können Sie standardmäßig keine dynamischen Informationen abrufen, Sie können jedoch einen eigenen Dienst schreiben, um dies zu tun.
Übrigens: Ich benutze lieber VisualVM als JConsole.
Es gibt ein Kommandozeilen-Tool mit einem visuellen Aspekt - jvm-mon . Es ist ein JVM-Überwachungstool für die Befehlszeile, das nicht funktioniert:
Die Metriken und Diagramme werden aktualisiert, während das Tool geöffnet ist.
Spät auf der Party, aber eine sehr einfache Lösung ist die Verwendung des Skripts jpsstat.sh. Es bietet einen einfachen Live aktuellen Speicher , maximalen Speicher und CPU-Nutzung Details.
Hier ist die Beispielausgabe von script -
===== ====== ======= ======= =====
PID Name CurHeap MaxHeap %_CPU
===== ====== ======= ======= =====
2777 Test3 1.26 1.26 5.8
2582 Test1 2.52 2.52 8.3
2562 Test2 2.52 2.52 6.4
Jeder Ansatz sollte Ihnen ungefähr die gleiche Zahl geben. Es ist immer eine gute Idee, den Heap mit -X..m
-X..x
für alle Generationen zuzuweisen. Sie können dann ps garantieren und auch tun, 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 für diese Werte bedeuten tatsächlich. Angenommen, Sie führen eine einfache Klasse ohne MMAP- oder Dateiverarbeitung aus.
$ jstat -gccapacity 32277
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
215040.0 3433472.0 73728.0 512.0 512.0 67072.0 430080.0 6867968.0 392704.0 392704.0 0.0 1083392.0 39680.0 0.0 1048576.0 4864.0 7225 2
$ jstat -gcutil 32277
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
6.25 0.00 7.96 18.21 98.01 95.29 7228 30.859 2 0.173 31.032
Max :
NGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX
3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB
(ungefähr in der Nähe und unterhalb des VIRT-Speichers)
Max (Min, Used):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
(ungefähr in der Nähe des RES-Speichers)
"Zitiere mich nicht dazu", aber VIRT mem ist ungefähr gleich oder größer als der maximal zugewiesene Speicher, aber solange Speicher verwendet wird ist frei/JVM ist im physischen Speicher verfügbar und löst keine Speicherausnahme aus. Tatsächlich wird der maximale Arbeitsspeicher beim Starten von JVM nicht einmal mit dem physischen Arbeitsspeicher verglichen, selbst wenn das Betriebssystem zum Auslagern ausgeschaltet ist. Eine bessere Erklärung, welcher virtuelle Speicher von einem Java -Prozess tatsächlich verwendet wird, wird hier erläutert .
Ab Java8 können Sie den folgenden Befehl verwenden:
jcmd Java_PROCESS_ID
GC.heap_info
Sie können sich auf die Summe, den Gesamt- und den belegten Speicher der Ausgabe beziehen.
Sample Command And Output: jcmd 9758 GC.heap_info
PSYoungGen total 1579520K, used 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
Weitere Informationen zum Befehl jcmd finden Sie unter folgendem Link: https://docs.Oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html
Ermitteln Sie zunächst die Prozess-ID, die erste Nummer aus dem aufgelisteten Prozess, aus einer der folgenden Angaben: (oder verwenden Sie einfach ps aux | grep Java
, wenn Sie dies vorziehen.)
jps -lvm
Dann verwenden Sie hier die Prozess-ID:
jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID
Die Verwendung des Befehls top
ist die einfachste Möglichkeit, die Speichernutzung des Programms zu überprüfen. Die Spalte RES
zeigt den realen physischen Speicher, der von einem Prozess belegt wird.
In meinem Fall hatte ich eine 10g-Datei in Java eingelesen und jedes Mal, wenn ich die Ausnahme outOfMemory bekam. Dies geschah, als der Wert in der Spalte RES
den in der Option -Xmx
festgelegten Wert erreichte. Durch Erhöhen des Speichers mit der Option -Xmx
ging alles in Ordnung.
jstat -gccapacity javapid (ex. stat -gccapacity 28745)
jstat -gccapacity javapid gaps frames (ex. stat -gccapacity 28745 550 10 )
Beispiel-O/P des obigen Befehls
NGCMN NGCMX NGC S0C
87040.0 1397760.0 1327616.0 107520.0
NGCMN Minimum new generation capacity (KB).
NGCMX Maximum new generation capacity (KB).
NGC Current new generation capacity (KB).
Weitere Informationen hierzu finden Sie unter http://docs.Oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
In Bezug auf die Java Heap-Größe können Sie unter Linux verwenden
ps aux | grep Java
oder
ps -ef | grep Java
und 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.
Java -XX:+PrintFlagsFinal -version | grep HeapSize
oder eine bestimmte jvm, zum Beispiel,
/path/to/jdk1.8.0_102/bin/Java -XX:+PrintFlagsFinal -version | grep HeapSize
und suchen Sie nach InitialHeapSize und MaxHeapSize, die in Bytes ist.
Wenn Sie jrockit verwenden, versuchen Sie es mit dem Befehlszeilentool jrcmd. Zum Beispiel:
$ jrcmd 5127 print_memusage
5127:
Total mapped 1074596KB (reserved=3728KB)
- Java heap 786432KB (reserved=0KB)
- GC tables 26316KB
- Thread stacks 13452KB (#threads=34)
- Compiled code 9856KB (used=9761KB)
- Internal 840KB
- OS 15036KB
- Other 146632KB
- Java class data 75008KB (malloced=74861KB #103221 in 18709 classes)
- Native memory tracking 1024KB (malloced=102KB #8)
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
Bisher gibt es kein solches Tool, um den Heapspeicher in dem von Ihnen gewünschten Format zu drucken. Die einzige und einzige Möglichkeit zum Drucken ist das Schreiben eines Java Programm mit Hilfe von Runtime Class ,
public class TestMemory {
public static void main(String [] args) {
int MB = 1024*1024;
//Getting the runtime reference from system
Runtime runtime = Runtime.getRuntime();
//Print used memory
System.out.println("Used Memory:"
+ (runtime.totalMemory() - runtime.freeMemory()) / MB);
//Print free memory
System.out.println("Free Memory:"
+ runtime.freeMemory() / mb);
//Print total available memory
System.out.println("Total Memory:" + runtime.totalMemory() / MB);
//Print Maximum available memory
System.out.println("Max Memory:" + runtime.maxMemory() / MB);
}
}
referenz: https://viralpatel.net/blogs/getting-jvm-heap-size-used-memory-total-memory-using-Java-runtime/