Finden Sie die Größe Ihres Java-Heapspeichers heraus
In diesem Artikel zeigen wir Ihnen, wie Sie die-XX:+PrintFlagsFinal
verwenden, um die Details Ihrer Heap-Größe herauszufinden. In Java werden die Standard- und die maximale Heap-Größe basierend auf diesen -ergonomics
algorithm zugewiesen.
Heap-Größen
Anfängliche Heap-Größe von 1/64 des physischen Speichers bis zu 1 GByte
Maximale Heap-Größe von 1/4 des physischen Speichers bis zu 1 GByte
Die oben genannten Algorithmen dienen jedoch nur als Referenz und können in verschiedenen VMs variieren.
1. Java-Speicherübersicht
Ein kurzer Überblick über die Java-Speicherstruktur:
1. Java Heap Size
Speicherort für Objekte, die von Ihrer Java-Anwendung erstellt wurden. Hier findet die Garbage Collection statt, der von Ihrer Java-Anwendung verwendete Speicher. Bei einem schweren Java-Prozess führt eine unzureichende Heap-Größe zu den beliebtenjava.lang.OutOfMemoryError: Java heap space
.
-Xms- Set initial Java heap size -Xmx - Set maximum Java heap size $ java -Xms512m -Xmx1024m JavaApp
2. Perm Gen Size
Ort zum Speichern Ihrer geladenen Klassendefinition und Metadaten. Wenn ein großes Code-Basis-Projekt geladen wird, verursacht die unzureichende Perm-Gen-Größe die beliebtenJava.Lang.OutOfMemoryError: PermGen
.
-XX:PermSize- Set initial PermGen Size. -XX:MaxPermSize - Set the maximum PermGen Size. $ java -XX:PermSize=64m -XX:MaxPermSize=128m JavaApp
3. Java Stack Size
Größe eines Java-Threads. Wenn in einem Projekt viele Threads verarbeitet werden, reduzieren Sie diese Stapelgröße, um zu vermeiden, dass nicht genügend Arbeitsspeicher zur Verfügung steht.
-Xss = Java-Thread-Stapelgröße festlegen
$ java -Xss512k JavaApp
Note
Der Standardwert für Heap-Größe, Perm-Gen oder Stack-Größe unterscheidet sich von verschiedenen JVMs. Die beste Vorgehensweise besteht darin, immer Ihren eigenen Wert zu definieren.
2. Ubuntu
Dies ist die Testumgebung:
OS : Ubuntu 13 (64 bits) (Under VirtualBox) RAM : 4G CPU : 1 x Processors JDK : 1.7.0_51
$ java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize' uintx InitialHeapSize := 64781184 {product} uintx MaxHeapSize := 1038090240 {product} uintx PermSize = 21757952 {pd product} uintx MaxPermSize = 174063616 {pd product} intx ThreadStackSize = 1024 {pd product} java version "1.7.0_51" OpenJDK Runtime Environment (IcedTea 2.4.4) (7u51-2.4.4-0ubuntu0.13.10.1) OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
In der obigen Umgebung hat JVM die folgenden Standardwerte zugewiesen:
-
Java heap size
InitialHeapSize = 64781184 Byte (61,7 MB) und MaxHeapSize = 1038090240 Byte (990 MB). -
PermGen Size
PermSize = 21757952 Bytes (20,75 MB), MaxPermSize = 174063616 Bytes (166 MB) -
Thread Stack Size
ThreadStackSize = 1024 Kilobyte (1 MB)
Die zugewiesene Größe des Heapspeichers liegt ziemlich nahe am Ergonomieergebnis.
#ergonomics algorithm Initial heap size = 4096M/64 = 64M Maximum heap size = 4096M/4 = 1024M
3. Mac OS X
Dies ist die Testumgebung:
OS : Mac OSX 10.9 RAM : 8G CPU : 4 x Processors JDK : 1.7.0_05
$ java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize' 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)
-
Java heap size
InitialHeapSize = 20655360 Byte (19,69 MB) und MaxHeapSize = 331350016 Byte (316 MB). -
PermGen Size
PermSize = 21757952 Bytes (20,75 MB), MaxPermSize = 85983232 Bytes (82 MB). -
Java Stack Size
ThreadStackSize = 1024 Kilobyte (1 MB)
Die zugewiesene Größe des Heapspeichers ist im Vergleich zum folgenden Ergonomieergebnis völlig irrelevant.
#ergonomics algorithm Initial heap size = 8192M/64 = 128M Maximum heap size = 8192M/4 = 2048M
4. Windows
In Windows gibt es keinegrep
, stattdessen verwenden wirfindstr
.
Dies ist die Testumgebung:
OS : Windows 8 RAM : 16G CPU : 8 x Processors JDK : 1.7.0_40
C:\>java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize" uintx InitialHeapSize := 266634176 {product} uintx MaxHeapSize := 4267704320 {product} uintx PermSize = 21757952 {pd product} uintx MaxPermSize = 85983232 {pd product} intx ThreadStackSize = 0 {pd product} java version "1.7.0_40" Java(TM) SE Runtime Environment (build 1.7.0_40-b43) Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
-
Java heap size
InitialHeapSize = 266634176 Byte (256 MB) und MaxHeapSize = 4266146816 Byte (4068 MB). -
PermGen Size
PermSize = 21757952 Bytes (20,75 MB), MaxPermSize = 85983232 Bytes (823). M). -
Java Stack Size
ThreadStackSize = 0 Kilobyte. (seltsam…)
Die zugewiesene Größe des Heapspeichers entspricht nahezu dem Ergebnis der Ergonomie:
#ergonomics algorithm Initial heap size = 16384/64 = 256M Maximum heap size = 16384/4 = 4096M
5. Vorgeschlagener Java-Speicher
Unten ist mein empfohlener Wert für eine kleine bis mittlere Java-Anwendung :)
-
Heap = -Xms512m -Xmx1024m
-
PermGen = -XX: PermSize = 64 m -XX: MaxPermSize = 128 m
-
Thread = -Xss512k
P.S For most Java projects, 512k for a thread is sufficient.
$ java -XX:+PrintFlagsFinal -Xms512m -Xmx1024m -Xss512k -XX:PermSize=64m -XX:MaxPermSize=128m -version | grep -iE 'HeapSize|PermSize|ThreadStackSize' uintx InitialHeapSize := 536870912 {product} uintx MaxHeapSize := 1073741824 {product} uintx PermSize := 67108864 {pd product} uintx MaxPermSize := 134217728 {pd product} intx ThreadStackSize := 512 {pd product}
6. FAQs
Q. What is -version?
A. Vermeiden Sie die Beschwerden des Java-Compilers und ersetzen Sie die "-Version" durch Ihren Java-Anwendungsnamen.
$ java -XX:+PrintFlagsFinal {your-java-program} | grep HeapSize
Q. What is -XX:+PrintCommandLineFlags?
A. Dieses-XX:+PrintCommandLineFlags
wird verwendet, um die Werte auszudrucken, die nur von VM geändert wurden (angezeigt durch dieses:=
-Symbol).
7. Fazit
Schließlich unterscheiden sich die Standardwerte für Heapspeicher, Perm-Gem und Stapelgröße von den einzelnen JVMs. Erwarten Sie nicht, dass JVM die optimalen Werte für Ihre Java-Anwendung zuweist. Am besten ermitteln Sie Ihre Speicherdetails und passen die Werte entsprechend an.
Nur einige herausfinden und teilen, lassen Sie mich Ihren Kommentar wissen.