Ich habe in meiner Anwendung auf die berüchtigte OutOfMemoryException gestoßen und anstatt einfach den verfügbaren Heap Space zu vergrößern, habe ich versucht, das Problem zu untersuchen, nur für den Fall, dass es ein Leck gab von meiner Bewerbung.
Ich habe den JVM-Parameter -XX: + HeapDumpOnOutOfMemoryError hinzugefügt, der beim Auftreten des OutOfMemory-Fehlers einen Heap-Dump erstellt. Ich analysierte dann die Dump-Datei, die mit verschiedenen Profiling-Tools erstellt wurde. Ich begann dann mit dem Parameter -Xmx herumzuspielen und Muster zu beobachten.
Was mich verwirrt hat, ist folgendes. Warum habe ich beim Analysieren des Dumps festgestellt, dass die Gesamtgröße aller Objekte viel kleiner ist als die Summe, die ich mit dem Parameter -Xmx festgelegt habe? Angenommen, ich setze -Xmx auf '2048m'. Als ich die Dump-Datei analysiert habe, habe ich insgesamt 400Mb Objekte auf dem Heap gefunden. Ich habe erwartet, 2GB zu finden. Fehle ich etwas?
Lesen Sie Ihre Fehlermeldung erneut - es kann Ihnen sagen, welche Art von Speicher Ihnen ausgegangen ist. Ich nehme an, dass es PermGen war. Permgen wird unter anderem für Klassendefinitionen verwendet. Sie können den Speicherplatz für PermGen über -XX: MaxPermSize anpassen. PermGen ist nicht Teil des Heapspeichers und daher nicht im Heapspeicher enthalten.
Weitere Informationen zum Betrachten von PermGen finden Sie diese Antwort .
Wenn dies nicht der Fall ist, versuchen Sie, die anfängliche Heap-Größe (-Xms) auf den Maximalwert einzustellen. Dies bedeutet, dass der Heap nicht wachsen wird, was das Verständnis erleichtern sollte.
Ich empfehle die Verwendung von jvisualvm (Teil des JDK), um Ihre Speicherauslastung während der Ausführung Ihres Programms zu überprüfen.
Meine Vermutung ist, dass moderne GCs den Heap in separate Speicherbereiche (junge / feste / permanente Generationen) partitionieren, es reicht aus, wenn der permanente Generierungsraum vollständig gefüllt wird, damit ein Speicherfehler auftritt. Sie können das Verhältnis der verschiedenen Speicherbereiche mithilfe verschiedener JVM-Befehlszeilenoptionen konfigurieren.
Hier ist ein guter Artikel über Tuning Garbage Collection mit dem 5.0 Java [tm] Virtual Machine (Ich konnte keinen neueren finden, aber ich denke, dass die Grundlagen in neueren VMs immer noch gelten).
Tags und Links java heap out-of-memory