String-Literale werden nicht im Stapel gespeichert. Noch nie. Tatsächlich werden keine Objekte auf dem Stapel gespeichert.
Stringliterale (oder genauer gesagt, die String - Objekte , die sie vertreten) sind historisch in einem Heap gespeichert wurden genannt die „PermGen“ Haufen. (Permgen steht für permanente Erzeugung.)
Unter normalen Umständen sind String-Literale und viele andere Dinge im Permgen-Heap "permanent" erreichbar und werden nicht durch Müll gesammelt. (Beispielsweise sind String-Literale immer über die Codeobjekte erreichbar, die sie verwenden.) Sie können jedoch eine JVM so konfigurieren, dass versucht wird, dynamisch geladene Klassen zu finden und zu sammeln, die nicht mehr benötigt werden. Dies kann dazu führen, dass String-Literale durch Müll gesammelt werden .
ERKLÄRUNG 1 - Ich sage nicht, dass Permgen nicht GC'ed wird. Dies ist normalerweise der Fall, wenn die JVM beschließt, einen vollständigen GC auszuführen. Mein Punkt ist, dass String- Literale erreichbar sind, solange der Code, der sie verwendet, erreichbar ist, und der Code erreichbar ist, solange der Klassenlader des Codes erreichbar ist, und für die Standard-Klassenlader bedeutet dies "für immer".
CLARIFICATION # 2 - Tatsächlich verwendet Java 7 und höher den regulären Heap, um den Zeichenfolgenpool zu speichern. Daher befinden sich String-Objekte, die String-Literale und interne Zeichenfolgen darstellen, tatsächlich im regulären Heap. (Einzelheiten finden Sie in der Antwort von @ assylias.)
Aber ich versuche immer noch, eine dünne Linie zwischen der Speicherung des String-Literal und dem mit erstellten String herauszufinden new
.
Es gibt keine "dünne Linie". Es ist wirklich sehr einfach:
String
Objekte, die Zeichenfolgenliterale darstellen / diesen entsprechen, werden im Zeichenfolgenpool gespeichert.
String
Objekte, die durch einen String::intern
Aufruf erstellt wurden , werden im Zeichenfolgenpool gespeichert.
- Alle anderen
String
Objekte werden NICHT im String-Pool gespeichert.
Dann gibt es die separate Frage, wo der String-Pool "gespeichert" ist. Vor Java 7 war es der Permgen-Heap. Ab Java 7 ist es der Haupthaufen.