Lernen Sie wichtige JVM-Optionen (Java Virtual Machine) für eine bessere Leistung und ein besseres Debugging kennen.
If you are a Java Entwickler Wenn Sie ein Middleware-Administrator sind, sollten Sie wissen, was JVM-Optionen zusammen mit ihrer Bedeutung bedeuten und wie sie sich auf Ihre Anwendung auswirken. Lassen Sie uns sie herausfinden.
Übersicht über die JVM-Optionen
Wenn Sie über JVM-Optionen sprechen, gibt es drei Arten von Optionen, die Sie in Ihre JVM aufnehmen können: Standard-, Nicht-Standard- und erweiterte Optionen. Wenn Sie eine erweiterte Option ausprobieren, verwenden Sie die Option immer mit -XX
. Wenn Sie eine nicht standardmäßige Option anwenden, verwenden Sie diese ebenfalls -X
. Standardoptionen stellen der Option nichts voran.
Welche JVM-Optionen werden von Ihrer Anwendung verwendet?
Wenn die Anwendung unter Linux ausgeführt wird, können Sie verwenden ps -ef | grep java
um den Java-Prozess zu identifizieren und die als Prozessargumente gedruckten JVM-Optionen zu betrachten. Wenn mehr als ein Java-Prozess auf dem System ausgeführt wird, müssen Sie möglicherweise ein Schlüsselwort verwenden, das für Ihre Java-Anwendung eindeutig ist.
Wenn Ihr Argument zu lang ist, versuchen Sie es mit ps -auxww
da dieser Befehl auch eine lange Argumentliste anzeigt.
Nachdem Sie eine Liste der JVM-Flags erstellt haben, können Sie sich ein Bild über das Verhalten jeder Java-Anwendung machen, z. B. Tomcat.
Java heap size
-Xms- Legen Sie die anfängliche Java-Heap-Größe fest -Xmx- Legen Sie die maximale Java-Heap-Größe fest -Xss- Legen Sie die Größe des Java-Thread-Stapels fest
-Xms - Diese Option dient zum Definieren der Startheapgröße für JVM, z.Xms2048m
Dies bedeutet, dass eine anfängliche Heap-Größe von JVM etwa 2 GB beträgt. Wenn also eine JVM gestartet wird, ist der Heapspeicher so groß. Überraschenderweise ja! Dies wird durchgeführt, um eine Größenänderung während des Startvorgangs zu verhindern und die Startzeit von JVM zu verlängern.
-Xmx - Diese Option dient zum Definieren der maximalen Heap-Größe von JVM, z.Xmx2048m
Dies bedeutet, dass die maximale Heap-Größe von JVM nur 2 GB beträgt.
Sie werden im Wesentlichen immer haben-Xms
und -Xmx
perfekter Harmonie.
Set Percentage of the heap
-XX: MaxHeapFreeRatio - Legt den maximalen Prozentsatz an freiem Haufen nach der GC fest, um ein Schrumpfen zu vermeiden.
-XX: MinHeapFreeRatio - legt den Mindestprozentsatz an freiem Heap nach GC fest, um eine Expansion zu vermeiden; Um die Heap-Nutzung zu überwachen, können Sie JCosole verwenden.
Enable class data sharing
Angeben Xshareclasses
Option zum Aktivieren der gemeinsamen Nutzung von Klassendaten in einem gemeinsam genutzten Klassencache. Die JVM stellt eine Verbindung zu einem vorhandenen Cache her oder erstellt einen Cache, falls keiner vorhanden ist. Sie können mehrere Caches haben und den richtigen Cache angeben, indem Sie dem eine Cache hinzufügen -Xshareclasses
.
PermGen Size
Frühere JVM-Optionen definieren aber die Größe des Heapspeichers -XX:PermSize
definiert die Größe des PermGen-Speicherplatzes, in dem der Zeichenfolgenpool und die Klassenmetadaten gespeichert werden. Diese Option ist besonders effektiv für einen Webserver wie Tomcat, der während der Bereitstellung häufig Klassen der Webanwendung lädt.
Übrigens ist es wichtig zu wissen, dass der PermGen-Speicherplatz von Metaspace in Java 8 übernommen wird. Diese Option ist nicht anwendbar, wenn Sie mit JRE 8 JVM ausgeführt werden.
Print GC
-verbose: gc - protokolliert die Ausführung des Garbage Collectors und wie lange sie dauern. -XX: + PrintGCDetails - enthält die Daten von -verbose: gc, fügt aber auch Informationen über die Größe der neuen Generation und genauere Timings hinzu. -XX: -PrintGCTimeStamps - Drucken Sie Zeitstempel bei der Speicherbereinigung.
Diese JVM-Optionen werden verwendet, um die Garbage Collection-Protokollierung zu aktivieren, die für den latenzempfindlichen Vorgang sehr effektiv ist. Früher befanden wir uns auf Systemen, auf denen wir nach Latenzen im Mikrosekundenbereich suchen. Wenn Sie erkennen, kann eine große Speicherbereinigung mehrere Millisekunden dauern.
Wir entscheiden uns für eine GC-freie Architektur wie den LMAX-Disruptor. Wenn Sie sich jedoch nicht für eine Anwendung mit extrem hoher Latenzzeit entscheiden, empfiehlt Ihnen diese praktische Option wichtige GC-Statistiken. Sie erfahren, ob es sich um eine große oder eine kleine Speicherbereinigung handelt, welche Art von Speicherbereinigung angewendet wird, wie oft Speicher wiederhergestellt wird und wie viel Zeit er gespeichert hat usw.
Handling ‘OutOfMemory’ Error
Sie können verwenden, um einen Heap-Dump für nicht genügend Speicher auszulösen -XX:+HeapDumpOnOutOfMemoryError
Diese JVM-Option erzeugt einen Stapelspeicherauszug, wenn Ihre JVM mit OutOfMemory-Fehler stirbt. Es fallen keine Kosten an, es sei denn, ein OOM tritt tatsächlich auf. Dieses Flag ist eine Voraussetzung für Produktionssysteme, da es normalerweise die einzige Möglichkeit ist, das Problem genau zu bestimmen.
Der Heap-Dump wird standardmäßig im „aktuellen Verzeichnis“ der JVM eingerichtet. Wenn Sie Heap-Dumps für ein bestimmtes Verzeichnis erstellen möchten, führen Sie diese aus
-XX:HeapDumpPath= [path-to-heap-dump-directory]
-XX:+UseGCOverheadLimit
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
Die Heap-Dump-Datei kann bis zu Gigabyte groß sein. Stellen Sie daher sicher, dass das Zieldateisystem eine ausreichende Kapazität zulässt.
Wenn wir den Server sofort nach Auftreten von Speichermangel neu starten möchten, können wir diesen Parameter für denselben Zweck festlegen -
XX:OnOutOfMemoryError="shutdown -r"
Trace classloading and unloading
-XX:+TraceClassLoading
und -XX:+TraceClassUnloading
sind zwei JVM-Optionen, mit denen wir Protokollinformationen drucken, wenn Klassen in JVM geladen oder aus JVM entladen werden. Diese JVM-Flags sind nützlich, wenn mit dem Klassenladeprogramm ein Speicherverlust verbunden ist und der Verdacht besteht, dass Klassen nicht entladen oder Müll gesammelt werden.
Java classpath
Apropos JAVA Classpath-Xbootclasspath
Gibt Klassenpfadeinträge an, die ohne Überprüfung geladen werden sollen. Die JVM überprüft alle Klassen, die sie lädt, um sicherzustellen, dass sie nicht versucht, ein Objekt mit einem int zu dereferenzieren, zusätzliche Einträge vom Stapel zu entfernen oder zu viele zu verschieben usw.
Wenn Sie eine Klasse in den Bootklassenpfad einfügen, werden die Kosten ebenfalls übersprungen, sie sollten jedoch nur verwendet werden, wenn Sie wissen, dass die Klassen bereits mehrfach überprüft wurden. In JRuby reduzierte dies die Startzeit für ein einfaches Skript um die Hälfte und mehr.
Profiling
Bei der Java-Profilerstellung werden verschiedene Parameter auf JVM-Ebene überwacht, z. B. Methodenausführungen, Thread-Ausführungen, Garbage Collections und Objekterstellungen. Mit Java Profiling erhalten Sie einen genaueren Überblick über die Ausführung Ihrer Zielanwendung und deren Ressourcennutzung.
-Xprof
-Xrunhprof
64-bit environment
In der Betriebssystemumgebung, in der sowohl 32- als auch 64-Bit-Pakete installiert sind, wählt die JVM automatisch 32-Bit-Umgebungspakete als Standard aus.
Wenn wir die Umgebung manuell auf 64-Bit einstellen möchten, können wir dies mit verwenden -d<OS bit>
Parameter. Und natürlich kann das Betriebssystembit entweder 32 oder 64 sein.
Conclusion
Ich hoffe, dies hilft Ihnen bei der Konfiguration von JVM-Parametern für Ihre Anwendung. Wenn Sie mehr über die Java-Speicherverwaltung erfahren möchten, lesen Sie diese Informationen Udemy natürlich.