Dies ist eine theoretische Frage. Ich bin nur Kuriositäten, dass, wenn Java einen Mechanismus für Garbage Collection hat, um den Speicher zu befreien, warum immer noch OutOfMemoryError
auftreten?
Ich habe nach SO gesucht, konnte aber diese Links erhalten
Ist der Müllsammler garantiert? vor einem Fehler wegen zu wenig Speicher ausgeführt werden?
Garbage Collection vor OutOfMemoryError
Diese beantworten meine Frage nicht speziell. Wenn Java Speicher so gut durch Garbage Collection ermöglicht, warum tritt OutOfMemoryError
dann auf?
Ein OutOfMemoryError kann auftreten, wenn keines der Objekte im Speicher für die Garbage Collection geeignet ist. Zum Beispiel:
%Vor% Dies erstellt eine Liste und fügt MyClass
Objekte hinzu, bis der Speicher aufgebraucht ist. Keines der Objekte ist für die Garbage Collection geeignet, da es Referenzen auf alle Objekte gibt.
Es ist auch möglich, den Speicher auf eine Weise zu maskieren, die Sie nicht erwarten. Betrachten Sie das folgende String-Beispiel.
%Vor% Das Array chars
kann gesammelt werden. Das Array in string
wird möglicherweise nicht erfasst, da substring
einen Verweis auf das interne Array gefolgt von einem Offset und einem Bereich enthält. Somit bleiben 10 7 Zeichen zugeordnet, obwohl nur 5 * 10 6 verwendet und zugänglich sind.
Anscheinend hat String.substring
dieses Verhalten nicht mehr. In einem Artikel in der Java Performance Tuning Guide-Website berichtet Mikhail Vorontsov das in Java 1.7.0_06 und höher, String.substring
erstellt immer ein neues String
unabhängig von dem alten. Die String
-Klasse hat nicht mehr offset
und range
Instanzvariablen. Wenn Sie eine große Zeichenfolge erstellen, Teilzeichenfolgen verwenden und das Original wegwerfen, wird die char[]
der alten Zeichenfolge nicht entfernt.
Garbage Collector arbeitet mit Speicher, der nicht verwendet wird.
Wenn Sie jedoch Speicher zuweisen und der Speicher im Bereich ist, bedeutet dies, dass der Garbage Collector diesen Speicher nicht wirklich bereinigen kann.
Wenn der zugewiesene Speicher zu hoch über dem für die VM zulässigen liegt, erhalten Sie diese Ausnahme.
Ein Objekt, das immer noch einen Verweis auf den Code enthält, kann nicht gesammelt werden. Wenn es also einen Weg gibt, theoretisch auf ein Objekt zuzugreifen, bleibt es im Speicher stecken.
Nur so heißt es, Java beseitigt nicht die Notwendigkeit, sich um das Gedächtnis zu kümmern; Es automatisiert nur eine Menge Speicherverwaltung. Du musst immer noch deinen Teil dazu beitragen, dass du keine Objekte wegwirfst, nachdem ihr nützliches Leben vorbei ist ... denn solange sie (indirekt) erreicht werden können, nehmen sie Speicher auf, der nicht zurückgewonnen werden kann .
Wenn Sie keinen Speicher mehr haben und keine Variable oder kein Objekt zum Entfernen verfügbar ist, wird die Ausnahme ausgelöst.
Der beste Weg also, GC (Garbage Collection) zu verwenden, ist:
Ordnen Sie die Variable explizit dem Nullwert zu, wenn sie nicht mehr verwendet wird.
Tags und Links java garbage-collection out-of-memory