Müll-Sammlung von String-literalen
Ich bin beim Lesen über Garbage collection und ich bin immer verwirrend such-Ergebnisse, wenn ich Suche für String-literal garbage collections.
Ich brauche Klärung der folgenden Punkte:
- Ob ein string ist definiert als literal zur compile-Zeit [e.g:
String str = "java"
] dann wird es von der garbage Collection freigegeben? - Wenn verwenden intern die Methode [e.g:
String str = new String("java").intern()
] dann wird es Müll gesammelt? Auch wird es anders behandelt werden als String-literal in Punkt 1. - Einigen stellen wird erwähnt, dass Literale werden Müll werden nur erhoben, wenn
String
Klasse entladen werden? Macht es Sinn, denn ich glaube nicht, dassString
Klasse wird immer entladen werden.
1 - stackoverflow.com/questions/2202162/... ; 2 - stackoverflow.com/questions/6470651/... ; 3 - String a = new String("asd") -> "a" Referenz wird Müll gesammelt, sondern ist nur ein Verweis auf "asd" und "asd" wird immer da sein.
Wenn Sie suchen, mehr finden Sie Orte, zu erwähnen, dass String-Literale erstellt mit intern kann eine garbage Collection ausgeführt werden, da Sie schwache Referenz, aber ich kann es nicht bestätigen und das ist der Grund, warum ich gepostet, weil es viele gemischte Reaktionen.
“Von Java 7 wird die Java-String-Pool gespeichert ist, in den Heap-space, die garbage Collection der JVM. Der Vorteil dieses Ansatzes ist die geringere Gefahr von OutOfMemory-Fehler, da nicht referenzierte Strings aus dem pool entfernt werden, damit das freigeben von Speicher." Handbuch der Java-String-Pool von baeldung
Ole V. V. hat die richtige Antwort
Wenn Sie suchen, mehr finden Sie Orte, zu erwähnen, dass String-Literale erstellt mit intern kann eine garbage Collection ausgeführt werden, da Sie schwache Referenz, aber ich kann es nicht bestätigen und das ist der Grund, warum ich gepostet, weil es viele gemischte Reaktionen.
“Von Java 7 wird die Java-String-Pool gespeichert ist, in den Heap-space, die garbage Collection der JVM. Der Vorteil dieses Ansatzes ist die geringere Gefahr von OutOfMemory-Fehler, da nicht referenzierte Strings aus dem pool entfernt werden, damit das freigeben von Speicher." Handbuch der Java-String-Pool von baeldung
Ole V. V. hat die richtige Antwort
InformationsquelleAutor Lokesh | 2013-03-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wahrscheinlich nicht. Die code-Objekte enthalten eine oder mehrere Referenzen auf die
String
Objekte der Literale. So lange, wie die code-Objekte erreichbar sind, dieString
Objekte werden zu lassen.Ist es möglich für die code-Objekte unerreichbar werden, aber nur, wenn Sie dynamisch geladen ... und Ihre classloader ist zerstört.
Des zurückgegebenen Objektes durch die
intern
Anruf wird das gleiche Objekt repräsentiert die"java"
string-literal. (Die"java"
literal ist ein Praktikum in Klasse Ladezeit. Wenn Sie dann intern die neu errichtetenString
Objekt in Ihrem code-snippet, es wird lookup und zurück zuvor interniert"java"
string.)Jedoch interniert, die Zeichenfolgen, die nicht identisch mit string-literalen kann werden, Müll gesammelt, wenn Sie einmal nicht erreichbar sein sollten. Der PermGen space ist Müll gesammelt, auf der alle aktuellen HotSpot-JVMs. (Vor Java 8 ... die Tropfen PermGen völlig.)
Nein ... weil es ist das gleiche Objekt wie das string-literal.
Und in der Tat, wenn Sie verstehen, was Los ist, ist es klar, dass string-Literale werden nicht speziell behandelt. Es ist nur eine Anwendung von der "Erreichbarkeit" - Regel ...
Sind Sie richtig. Es macht keinen Sinn. Die Quellen, die sagte, die falsch sind. (Es wäre hilfreich, wenn Sie veröffentlicht eine URL, damit wir Lesen können, was Sie sagen, sind für uns ...)
Irgendwo in den code-Objekte (bytecode oder native kompiliert) gibt es Anweisungen, dass müssen Sie zu Holen die Referenz auf das String-Objekt, entsprechen den literalen. Entweder der Verweis ist eingebettet in den code selbst, oder es ist gespeichert in einem privaten Rahmen, der verbunden ist mit dem code. So oder so, die Referenz ist "erreichbar" so lange, wie der code könnte ausgeführt werden.
Danke. Und, ist die string-intern-pool Teil der Methode-Gebiet in der JVM?
Nein. Es ist eine separate Datenstruktur. Aber wenn Sie wirklich interessiert sind, ich schlage vor, Sie laden die OpenJDK-Quellcode und prüfen Sie es selbst.
InformationsquelleAutor Stephen C
Unter normalen Umständen, string-Literale und-Klassen werden alle zugewiesenen in der JVM die permanent generation ("PermGen"), und in der Regel werden nicht immer erfasst werden. Zeichenfolgen, die interniert (z.B.
mystring.intern()
), sind gespeichert in einem Speicher-pool im Besitz derString
Klasse in der permgen, und es war mal der Fall, dass aggressive Praktikum kann bewirken, dass ein Raum Leck, weil die string-pool selbst hielt eine Referenz auf jeden string, auch wenn keine anderen Hinweise gab. Anscheinend ist dies nicht mehr der Fall ist, zumindest ab JDK 1.6 (siehe, z.B., hier).Mehr auf der permgen, diese ist ein anständiger überblick über das Thema. (Hinweis: das link führt zu einem blog im Zusammenhang mit einem Produkt. Ich habe keine Verbindung mit dem blog, das Unternehmen oder das Produkt, sondern der blog-Eintrag ist nützlich und hat nicht viel mit dem Produkt zu tun.)
Natürlich hast du Recht. Meine Absicht war es nur zu sagen, dass die Daten zugewiesen, die in der permgen kommen die nicht GC ' ed wird unter normalen Umständen, aber ich misphrased. Leicht umformuliert.
Tatsächlich, tiefer zu Graben, entdeckte ich, dass es nicht mehr wahr, dass die Internierten strings nicht bekommen, Müll gesammelt. (Dies ist nicht wegen der permgen space, es ist aufgrund der Umsetzung der
String#intern
.) Die änderung meiner Antwort widerspiegeln.Es war nie true, interniert Saiten nicht bekommen, Müll gesammelt.
InformationsquelleAutor jacobm
str
wird Müll gesammelt, aber das literal erstellt, ist es aus nicht.Ein string-literal nicht, meines Wissens entladen werden programmgesteuert. Sie werden entfernt oder zerstört, wenn das Programm beendet wird.
Sie können auch eine garbage Collection ausgeführt werden, wenn eine Klasse, die wurde dynamisch geladen, entladen wird. Und das kann geschehen, während die JVM läuft normal.
ok. Gut zu wissen.
InformationsquelleAutor fredrik
intern()
Methode überprüft die Verfügbarkeit des Objektes in String-pool. Wenn das Objekt/literal verfügbar ist, dann Referenz wird zurückgegeben. Wenn das literal gibt es nicht in den pool-dann-Objekt geladen wird, im Gebiet perm (String-pool) und klicken Sie dann verweisen Sie auf ihn zurück. Wir haben die Verwendung vonintern()
Methode überlegt.InformationsquelleAutor AmitG