{"id":85,"date":"2023-12-08T01:10:27","date_gmt":"2023-12-08T00:10:27","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=85"},"modified":"2024-01-08T09:13:20","modified_gmt":"2024-01-08T08:13:20","slug":"grundlagen-der-jvm-speicherverwaltung","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=85","title":{"rendered":"Grundlagen der JVM-Speicherverwaltung"},"content":{"rendered":"\n<p>Die Java Virtual Machine (JVM) spielt eine entscheidende Rolle bei der Ausf\u00fchrung von Java-Anwendungen, indem sie den Java-Bytecode in maschinenlesbaren Code umsetzt. Eine der wichtigsten Aufgaben der JVM ist die effiziente Verwaltung des Speichers, um eine reibungslose Ausf\u00fchrung von Java-Programmen sicherzustellen. Die Speicherverwaltung der JVM umfasst verschiedene Konzepte wie Stack Memory, Heap-Space und Generational Garbage Collection.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Stack Memory<\/h2>\n\n\n\n<p>Der Stack ist ein Bereich des Speichers, der zur Verwaltung von lokalen Variablen und Aufrufinformationen verwendet wird. Jeder Thread einer Java-Anwendung hat seinen eigenen Stack, der unabh\u00e4ngig von anderen Threads ist. Der Stack ist in Frames unterteilt, wobei jeder Frame f\u00fcr eine Methode im Aufrufstapel steht.<\/p>\n\n\n\n<p>Wenn eine Methode aufgerufen wird, wird ein neuer Frame auf den Stack gelegt, der die lokalen Variablen der Methode, den Operandenstapel und andere Metainformationen enth\u00e4lt. Sobald die Methode abgeschlossen ist, wird der entsprechende Frame entfernt. Dieser Mechanismus erm\u00f6glicht eine effiziente Verwaltung von Methodenaufrufen und lokalen Variablen.<\/p>\n\n\n\n<p>In Bezug auf die Speicherzuweisung ist der Stack relativ leichtgewichtig und bietet schnellen Zugriff auf lokale Variablen. Allerdings ist der Stack begrenzt und wird normalerweise kleiner als der Heap dimensioniert. Daher eignet sich der Stack gut f\u00fcr kurze Lebensdauern von Daten und schnelle Operationen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">StackExample<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> void main(String&#91;] args) {\n        int x = <span class=\"hljs-number\">5<\/span>; <span class=\"hljs-comment\">\/\/ Variable x auf dem Stack<\/span>\n        int y = <span class=\"hljs-number\">10<\/span>; <span class=\"hljs-comment\">\/\/ Variable y auf dem Stack<\/span>\n        int result = add(x, y); <span class=\"hljs-comment\">\/\/ Methode aufrufen<\/span>\n        System.out.println(<span class=\"hljs-string\">\"Ergebnis: \"<\/span> + result);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> int add(int a, int b) {\n        <span class=\"hljs-keyword\">return<\/span> a + b; <span class=\"hljs-comment\">\/\/ Lokale Variablen a und b auf dem Stack<\/span>\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel werden die Variablen <code>x<\/code>, <code>y<\/code>, <code>a<\/code> und <code>b<\/code> auf dem Stack abgelegt, da sie lokale Variablen sind und eine kurze Lebensdauer haben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Heap-Space<\/h2>\n\n\n\n<p>Im Gegensatz zum Stack ist der Heap ein Bereich des Speichers, der zur Speicherung von Objekten und deren Daten verwendet wird. Der Heap ist gemeinsam f\u00fcr alle Threads einer Java-Anwendung und wird beim Start der JVM initialisiert. Der Heap bietet mehr Platz als der Stack, aber der Zugriff auf Daten im Heap ist langsamer.<\/p>\n\n\n\n<p>Der Heap wird in verschiedene Bereiche unterteilt, darunter der Young Generation Space, der Old Generation Space und der Permanent Generation Space (ab Java 8 durch den sogenannten Metaspace ersetzt). Die Young Generation enth\u00e4lt neu erstellte Objekte, w\u00e4hrend die Old Generation l\u00e4ngerlebige Objekte enth\u00e4lt.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">HeapExample<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-comment\">\/\/ Objekte auf dem Heap erstellen<\/span>\n        <span class=\"hljs-built_in\">String<\/span> str1 = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">String<\/span>(<span class=\"hljs-string\">\"Hallo\"<\/span>);\n        <span class=\"hljs-built_in\">String<\/span> str2 = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">String<\/span>(<span class=\"hljs-string\">\"Welt\"<\/span>);\n        <span class=\"hljs-built_in\">String<\/span> greeting = str1 + <span class=\"hljs-string\">\" \"<\/span> + str2;\n        System.out.println(greeting);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel werden die Zeichenketten &#8222;Hallo&#8220; und &#8222;Welt&#8220; als Objekte im Heap erstellt. Die Variable <code>greeting<\/code> verweist auf ein neues Objekt im Heap, das durch die Verkettung der beiden Zeichenketten entstanden ist.<\/p>\n\n\n\n<p>Der Heap ist f\u00fcr die Speicherung von Objekten mit l\u00e4ngeren Lebensdauern geeignet, da die Daten im Heap so lange existieren, wie es Referenzen darauf gibt. Die JVM verwendet Garbage Collection, um nicht mehr ben\u00f6tigte Objekte zu identifizieren und freizugeben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Generational Garbage Collection<\/h2>\n\n\n\n<p>Die Generational Garbage Collection ist ein Konzept, das auf der Beobachtung basiert, dass die meisten Objekte kurzlebig sind. In der Praxis bedeutet dies, dass viele Objekte kurz nach ihrer Erstellung nicht mehr ben\u00f6tigt werden. Die Generational Garbage Collection unterteilt den Heap daher in verschiedene Generationen, um die Verwaltung und Bereinigung zu optimieren.<\/p>\n\n\n\n<p>Die Young Generation enth\u00e4lt neue Objekte, w\u00e4hrend die Old Generation Objekte enth\u00e4lt, die l\u00e4nger \u00fcberlebt haben. Die Idee ist, dass kurzlebige Objekte schneller erkannt und gesammelt werden k\u00f6nnen, w\u00e4hrend l\u00e4ngerlebige Objekte seltener \u00fcberpr\u00fcft werden m\u00fcssen.<\/p>\n\n\n\n<p>W\u00e4hrend des Lebenszyklus eines Programms durchl\u00e4uft ein Objekt verschiedene Phasen, von der Erstellung bis zur Freigabe. Die Generational Garbage Collection verwendet zwei Haupttypen von Garbage-Collection-Algorithmen: den <strong>Minor Garbage Collector<\/strong> f\u00fcr die Young Generation und den <strong>Major Garbage Collector<\/strong> f\u00fcr die Old Generation.<\/p>\n\n\n\n<p>Der <strong>Minor Garbage Collector<\/strong> sammelt kurzlebige Objekte in der Young Generation und f\u00fchrt eine sogenannte &#8222;Minor GC&#8220; durch. Dieser Prozess markiert und sammelt nicht mehr ben\u00f6tigte Objekte, w\u00e4hrend die verbleibenden Objekte in die Old Generation verschoben werden k\u00f6nnen.<\/p>\n\n\n\n<p>Der <strong>Major Garbage Collector<\/strong> ist f\u00fcr die Bereinigung der Old Generation verantwortlich. Da die Objekte in der Old Generation l\u00e4ngerlebig sind, erfolgt die Bereinigung seltener und erfordert mehr Ressourcen. Ein &#8222;Major GC&#8220; kann den gesamten Heap durchsuchen, um nicht mehr ben\u00f6tigte Objekte zu identifizieren und freizugeben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">GC-Logging der JVM<\/h2>\n\n\n\n<p>Um die Leistung der Generational Garbage Collection zu \u00fcberwachen und zu optimieren, bietet die JVM die M\u00f6glichkeit, sogenannte GC-Logs zu generieren. Diese Logs enthalten detaillierte Informationen \u00fcber den Zustand des Speichermanagements und die durchgef\u00fchrten Garbage-Collection-Vorg\u00e4nge.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Aktivierung des GC-Loggings<\/h3>\n\n\n\n<p>Das GC-Logging kann durch Hinzuf\u00fcgen von Parametern zur JVM-Ausf\u00fchrung aktiviert werden. Zum Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">java -Xlog:gc:file=gc.log -jar MeineAnwendung.jar<\/code><\/span><\/pre>\n\n\n<p>Dieser Befehl aktiviert das GC-Logging und speichert die Logdateien im aktuellen Verzeichnis unter dem Namen &#8222;gc.log&#8220;.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Interpretation der GC-Logs<\/h3>\n\n\n\n<p>Die GC-Logs enthalten eine Vielzahl von Informationen, einschlie\u00dflich Zeitstempel, verwendeter Speicher, durchgef\u00fchrte Garbage-Collection-Typen und mehr. Hier sind einige wichtige Aspekte, auf die Sie achten sollten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Zeitstempel:<\/strong> Jeder Logeintrag zeigt an, wann die Garbage Collection durchgef\u00fchrt wurde.<\/li>\n\n\n\n<li><strong>Verwendeter Speicher:<\/strong> Die Logs zeigen den Zustand des Speichers vor und nach der Garbage Collection, einschlie\u00dflich der Auslastung der verschiedenen Speicherbereiche.<\/li>\n\n\n\n<li><strong>Garbage-Collection-Typen:<\/strong> Die Logs unterscheiden zwischen verschiedenen Arten von Garbage Collection, wie Minor GC und Major GC, und zeigen an, welche Bereiche des Heaps betroffen sind.<\/li>\n<\/ul>\n\n\n\n<p>Durch das Analysieren dieser Informationen k\u00f6nnen Entwickler die Leistung ihrer Anwendungen verbessern, indem sie die Speicheranforderungen optimieren und m\u00f6gliche Engp\u00e4sse erkennen.<\/p>\n\n\n\n<p>Die GC-Logs k\u00f6nnen mit verschiedenen Tools analysiert werden, darunter der GCViewer, VisualVM und andere. Diese Tools erm\u00f6glichen eine visuelle Darstellung der Garbage-Collection-Vorg\u00e4nge und helfen dabei, potenzielle Probleme zu identifizieren.<\/p>\n\n\n\n<p>Insgesamt bietet das GC-Logging der JVM eine wertvolle M\u00f6glichkeit, die Speicherleistung von Java-Anwendungen zu \u00fcberwachen und zu optimieren, um eine reibungslose und effiziente Ausf\u00fchrung sicherzustellen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Java Virtual Machine (JVM) spielt eine entscheidende Rolle bei der Ausf\u00fchrung von Java-Anwendungen, indem sie den Java-Bytecode in maschinenlesbaren Code umsetzt. Eine der wichtigsten Aufgaben der JVM ist die effiziente Verwaltung des Speichers, um eine reibungslose Ausf\u00fchrung von Java-Programmen sicherzustellen. Die Speicherverwaltung der JVM umfasst verschiedene Konzepte wie Stack Memory, Heap-Space und Generational Garbage [&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-85","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\/85","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=85"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/85\/revisions"}],"predecessor-version":[{"id":86,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/85\/revisions\/86"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=85"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=85"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}