{"id":487,"date":"2024-08-18T21:04:36","date_gmt":"2024-08-18T20:04:36","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=487"},"modified":"2024-09-18T21:05:14","modified_gmt":"2024-09-18T20:05:14","slug":"die-wichtigsten-parameter-der-java-jvm","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=487","title":{"rendered":"Die wichtigsten Parameter der Java-JVM"},"content":{"rendered":"\n<p>Die Java Virtual Machine (JVM) ist das Herzst\u00fcck jeder Java-Anwendung. Sie stellt die Laufzeitumgebung bereit, in der Java-Programme ausgef\u00fchrt werden, und ist f\u00fcr das Management von Speicher, Threads und weiteren Ressourcen zust\u00e4ndig. In OpenJDK, der offenen Implementierung der Java-Plattform, bietet die JVM eine Vielzahl von Kommandozeilenparametern, die genutzt werden k\u00f6nnen, um das Verhalten der JVM zu konfigurieren und zu optimieren. In diesem Artikel werden die wichtigsten dieser Parameter erl\u00e4utert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Speicherverwaltung und Garbage Collection (GC)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1. <code>-Xms<\/code> und <code>-Xmx<\/code>: Festlegung des Heapspeichers<\/h3>\n\n\n\n<p>Der Heapspeicher ist der Bereich, in dem Java Objekte zur Laufzeit speichert. Die Parameter <code>-Xms<\/code> und <code>-Xmx<\/code> bestimmen die Mindest- und H\u00f6chstgr\u00f6\u00dfe des Heapspeichers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>-Xms&lt;size><\/code>: Legt die anf\u00e4ngliche Gr\u00f6\u00dfe des Heaps fest. Beispielsweise weist <code>-Xms512m<\/code> der JVM beim Start 512 MB Speicher zu.<\/li>\n\n\n\n<li><code>-Xmx&lt;size><\/code>: Bestimmt die maximale Gr\u00f6\u00dfe des Heaps. <code>-Xmx2g<\/code> erlaubt der JVM bis zu 2 GB Speicher zu nutzen.<\/li>\n<\/ul>\n\n\n\n<p>Es ist wichtig, diese Werte basierend auf den Anforderungen der Anwendung zu setzen. Ein zu kleiner Heap kann zu h\u00e4ufigen Garbage Collections f\u00fchren, w\u00e4hrend ein zu gro\u00dfer Heap unn\u00f6tigen Speicherverbrauch zur Folge hat.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.2. <code>-XX:+UseG1GC<\/code>: Aktivierung des G1 Garbage Collectors<\/h3>\n\n\n\n<p>Der Garbage Collector (GC) ist f\u00fcr die automatische Speicherverwaltung zust\u00e4ndig, indem er nicht mehr ben\u00f6tigte Objekte entfernt. Der G1 (Garbage First) GC ist ein moderner GC, der besonders f\u00fcr gro\u00dfe Heaps (&gt; 4 GB) geeignet ist. Mit dem Parameter <code>-XX:+UseG1GC<\/code> kann er aktiviert werden. Der G1 GC zielt darauf ab, kurze Pausenzeiten zu bieten und gleichzeitig eine hohe Durchsatzleistung zu gew\u00e4hrleisten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.3. <code>-XX:MaxGCPauseMillis<\/code>: Begrenzung der GC-Pausenzeiten<\/h3>\n\n\n\n<p>Mit <code>-XX:MaxGCPauseMillis=&lt;time&gt;<\/code> kann die maximale Zeit in Millisekunden festgelegt werden, die der GC f\u00fcr eine Pause ben\u00f6tigen darf. Beispielsweise bedeutet <code>-XX:MaxGCPauseMillis=200<\/code>, dass die JVM anstrebt, die Pausen des G1 GC auf maximal 200 Millisekunden zu begrenzen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Stack und Thread-Verwaltung<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1. <code>-Xss<\/code>: Festlegung der Thread-Stackgr\u00f6\u00dfe<\/h3>\n\n\n\n<p>Jeder Java-Thread ben\u00f6tigt einen eigenen Stack, der f\u00fcr die Speicherung von Methodenaufrufen, lokalen Variablen und anderen Informationen zust\u00e4ndig ist. Mit <code>-Xss&lt;size&gt;<\/code> kann die Gr\u00f6\u00dfe dieses Stacks festgelegt werden. Beispielsweise weist <code>-Xss512k<\/code> jedem Thread einen Stack von 512 KB zu. Eine zu kleine Stackgr\u00f6\u00dfe kann zu <code>StackOverflowError<\/code> f\u00fchren, w\u00e4hrend eine zu gro\u00dfe Stackgr\u00f6\u00dfe den Speicherverbrauch erh\u00f6ht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.2. <code>-XX:ParallelGCThreads<\/code>: Anzahl der GC-Threads festlegen<\/h3>\n\n\n\n<p>Der Parameter <code>-XX:ParallelGCThreads=&lt;n&gt;<\/code> bestimmt die Anzahl der Threads, die f\u00fcr parallele Garbage Collection-Phasen (wie bei ParallelGC oder G1GC) verwendet werden. Dies kann die GC-Leistung auf Mehrkernsystemen verbessern. Beispielsweise bedeutet <code>-XX:ParallelGCThreads=4<\/code>, dass der GC vier Threads f\u00fcr seine Arbeit verwendet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Just-In-Time (JIT) Compiler<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1. <code>-Xcomp<\/code>, <code>-Xint<\/code> und <code>-Xmixed<\/code>: Steuerung des Compilermodus<\/h3>\n\n\n\n<p>Java verwendet eine Kombination aus Interpretation und JIT-Compilierung, um Code auszuf\u00fchren. Die folgenden Parameter steuern, wie dieser Prozess abl\u00e4uft:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>-Xint<\/code>: F\u00fchrt den gesamten Code im Interpreter-Modus aus, was die Leistung drastisch verringern kann, aber n\u00fctzlich ist, um JIT-bezogene Fehler zu isolieren.<\/li>\n\n\n\n<li><code>-Xcomp<\/code>: Erzwingt die vollst\u00e4ndige JIT-Kompilierung von Anfang an, was zu einer l\u00e4ngeren Startzeit f\u00fchren kann, aber die Laufzeitleistung verbessert.<\/li>\n\n\n\n<li><code>-Xmixed<\/code>: Dies ist der Standardmodus und eine Mischung aus Interpretation und JIT-Kompilierung, wobei h\u00e4ufig genutzter Code zur Laufzeit kompiliert wird.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3.2. <code>-XX:CompileThreshold<\/code>: Steuerung der JIT-Kompilierung<\/h3>\n\n\n\n<p>Der Parameter <code>-XX:CompileThreshold=&lt;n&gt;<\/code> bestimmt, wie oft eine Methode aufgerufen werden muss, bevor sie vom JIT-Compiler kompiliert wird. Beispielsweise bedeutet <code>-XX:CompileThreshold=10000<\/code>, dass eine Methode 10.000 Mal aufgerufen werden muss, bevor sie kompiliert wird. Dieser Parameter kann angepasst werden, um die Balance zwischen Startleistung und optimierter Laufzeitleistung zu beeinflussen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. JVM Monitoring und Debugging<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1. <code>-Xloggc<\/code>: Logging der Garbage Collection<\/h3>\n\n\n\n<p>Mit <code>-Xloggc:&lt;file&gt;<\/code> k\u00f6nnen die Aktivit\u00e4ten des Garbage Collectors in eine Datei geschrieben werden. Dies ist n\u00fctzlich, um Einblicke in die GC-Performance und Pausenzeiten zu erhalten. Beispiel: <code>-Xloggc:\/path\/to\/gc.log<\/code> speichert die GC-Daten in der angegebenen Log-Datei.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.2. <code>-XX:+PrintGCDetails<\/code>: Detaillierte GC-Ausgaben<\/h3>\n\n\n\n<p>Dieser Parameter aktiviert detaillierte Informationen \u00fcber Garbage Collection-Vorg\u00e4nge in der JVM-Ausgabe. In Kombination mit <code>-XX:+PrintGCTimeStamps<\/code> k\u00f6nnen auch Zeitstempel hinzugef\u00fcgt werden, um das Timing der GC-Ereignisse besser zu verstehen. Beispiel: <code>-XX:+PrintGCDetails -XX:+PrintGCTimeStamps<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.3. <code>-XX:+HeapDumpOnOutOfMemoryError<\/code>: Heap-Dump bei Speicherfehlern<\/h3>\n\n\n\n<p>Wenn eine Java-Anwendung auf einen <code>OutOfMemoryError<\/code> st\u00f6\u00dft, kann die JVM einen Heap-Dump erstellen, der die Speicherbelegung zum Zeitpunkt des Fehlers enth\u00e4lt. Der Parameter <code>-XX:+HeapDumpOnOutOfMemoryError<\/code> aktiviert diese Funktion, und mit <code>-XX:HeapDumpPath=&lt;path&gt;<\/code> kann der Speicherort f\u00fcr den Dump festgelegt werden. Dies ist hilfreich, um Speicherprobleme zu analysieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.4. <code>-Xdebug<\/code> und <code>-Xrunjdwp<\/code>: Aktivierung des Debuggers<\/h3>\n\n\n\n<p>Mit <code>-Xdebug<\/code> kann die JVM im Debug-Modus gestartet werden, w\u00e4hrend <code>-Xrunjdwp<\/code> die JPDA (Java Platform Debugger Architecture) aktiviert. Ein Beispiel f\u00fcr die Verwendung:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000<\/code><\/span><\/pre>\n\n\n<p>Dies \u00f6ffnet die JVM f\u00fcr Remote-Debugging \u00fcber Port 8000, was besonders n\u00fctzlich f\u00fcr die Entwicklung und Fehlersuche in verteilten Systemen ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Class Loading und Performance<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">5.1. <code>-XX:+UseCompressedOops<\/code>: Speicheroptimierung f\u00fcr 64-Bit JVMs<\/h3>\n\n\n\n<p>In 64-Bit-JVMs ben\u00f6tigen Objektzeiger (Oops, Ordinary Object Pointers) normalerweise 64 Bit Speicher. Mit <code>-XX:+UseCompressedOops<\/code> k\u00f6nnen sie auf 32 Bit komprimiert werden, was Speicher spart, insbesondere bei Anwendungen mit gro\u00dfen Heaps. Dies ist in den meisten modernen JVMs standardm\u00e4\u00dfig aktiviert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.2. <code>-XX:+TieredCompilation<\/code>: Stufenweise JIT-Kompilierung<\/h3>\n\n\n\n<p>Der Parameter <code>-XX:+TieredCompilation<\/code> aktiviert eine stufenweise JIT-Kompilierung, bei der der Compiler verschiedene Optimierungsstufen durchl\u00e4uft, bevor er eine Methode endg\u00fcltig optimiert. Dies f\u00fchrt zu einer besseren Balance zwischen Start- und Laufzeitleistung und ist in neueren JVMs standardm\u00e4\u00dfig aktiviert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.3. <code>-XX:+ClassUnloading<\/code>: Freigabe von nicht verwendeten Klassen<\/h3>\n\n\n\n<p>In Anwendungen, die viele dynamische Klassen laden (z.B. Webanwendungen), k\u00f6nnen Klassen den Metaspace der JVM f\u00fcllen. Mit <code>-XX:+ClassUnloading<\/code> wird die Freigabe von nicht mehr genutzten Klassen nach einer GC-Runde aktiviert, wodurch Speicher effizienter genutzt wird.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Weitere n\u00fctzliche JVM-Parameter<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">6.1. <code>-XX:+ExitOnOutOfMemoryError<\/code><\/h3>\n\n\n\n<p>Dieser Parameter sorgt daf\u00fcr, dass die JVM bei einem <code>OutOfMemoryError<\/code> sofort beendet wird. Ohne diesen Parameter kann die JVM weiterhin laufen, aber in einem unvorhersehbaren Zustand.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6.2. <code>-XX:+AlwaysPreTouch<\/code><\/h3>\n\n\n\n<p><code>-XX:+AlwaysPreTouch<\/code> sorgt daf\u00fcr, dass die JVM beim Start den gesamten reservierten Speicherbereich des Heaps vorab &#8222;ber\u00fchrt&#8220;. Dies kann in Umgebungen mit einem NUMA-Architekturvorteil n\u00fctzlich sein, da der Speicherzugriff effizienter gestaltet wird.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Die JVM von OpenJDK bietet eine gro\u00dfe Vielfalt an Parametern, die Entwicklern und Systemadministratoren die M\u00f6glichkeit geben, das Verhalten und die Leistung von Java-Anwendungen pr\u00e4zise zu steuern. Durch eine sinnvolle Konfiguration k\u00f6nnen sowohl Startzeiten als auch die allgemeine Performance verbessert werden. Die Auswahl der richtigen Parameter sollte dabei immer im Kontext der spezifischen Anforderungen der Anwendung und der zugrunde liegenden Hardware getroffen werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Java Virtual Machine (JVM) ist das Herzst\u00fcck jeder Java-Anwendung. Sie stellt die Laufzeitumgebung bereit, in der Java-Programme ausgef\u00fchrt werden, und ist f\u00fcr das Management von Speicher, Threads und weiteren Ressourcen zust\u00e4ndig. In OpenJDK, der offenen Implementierung der Java-Plattform, bietet die JVM eine Vielzahl von Kommandozeilenparametern, die genutzt werden k\u00f6nnen, um das Verhalten der JVM [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-487","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/487","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=487"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/487\/revisions"}],"predecessor-version":[{"id":488,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/487\/revisions\/488"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=487"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=487"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=487"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}