2010-02-04 14 views
5

Ich habe einige Zweifel in Bezug auf StringsGarbage Collection und Strings

Sind sie live auf Heap oder String-Pool?

Und wenn auf Heap dann werden sie Müll gesammelt werden, wenn sie von keinem Live-Thread erreichbar sind.

Und wenn auf String-Pool dann, wie sie gelöscht werden oder entfernt werden, wie wir wissen, Garbage Collection passiert nur auf Heap.

Antwort

8
String s = new String("abc"); 

das String-Objekt durch s bezeichnet wird auf Halde und die Stringliteral "abc" wird in Zeichenfolge-Pool sein. Die Objekte im Zeichenfolgenpool werden nicht als Garbage Collected erfasst. Sie sollen während der Laufzeit des Programms wiederverwendet werden, um die Leistung zu verbessern.

+0

Wenn Sie die _constant pool_ beziehen, die Teil der Klassendefinition ist, dann _can_ Sie den konstanten Pool entladen kann, sofern Sie die Klasse entladen (die in der Regel dereferencing den Klassenlader und alle Verweise auf sie geladen ist Klassen). Schwieriger als Ihr typisches Programm, aber Tomcat tut es. –

4

Sie sind alle in dem Heap gespeichert, aber intern() ed Strings (einschließlich Stringliterale in der Quelle) sind aus einem Pool in der String Klasse verwiesen.

Wenn sie als Literale im Quellcode erscheinen, einschließlich Konstantenzeichenfolgenausdrücken (z. B. "a" + "b"), werden sie auch von der Class der in erscheinen, die normalerweise bedeutet, dass sie so lange dauern, wie der Prozess ausgeführt wird.

bearbeiten: Wenn Sie intern() auf eine Zeichenfolge in Ihrem Code nennen es auch zu diesem Pool hinzugefügt wird, sondern weil es nutzt schwache Verweise die Zeichenfolge kann noch Müll gesammelt werden, wenn sie nicht mehr in Gebrauch ist.

Siehe auch: interned Strings : Java Glossary

Zitat aus diesem Artikel:

Die Sammlung von Strings in diesem HashMap registrierte manchmal der String-Pool genannt wird. Sie sind jedoch gewöhnliche Objekte und leben auf dem Haufen wie jeder andere (vielleicht in einer optimierten Weise, da internierte Stränge dazu neigen, langlebig zu sein).

0

String Alex geht in die wörtliche Pool, bleibt dort solange der Prozess läuft (oder die Web-Anwendung bleibt geladen.), Wie gesagt, von finnw und ist nie Müll gesammelt. String name2 reserviert keinen Speicher für "Alex" und verwendet ihn aus dem Literalpool.

PS: Literal Pool ist auch auf dem Haufen.

Für Zeichenfolge John zwei Objekte werden mit Verweis Name3 und Name4 erstellt, die Müll sammeln sind.

String name = "Alex"; 
String name2 = "Alex"; 

String name3 = new String("John"); 
String name4 = new String("John");