Nachdem ich die String-Interna von Java erkundet habe, bin ich verwirrt, was man als "Perm Space" bezeichnet. Mein Verständnis anfänglich davon war, dass es String
Literale sowie Klassenmetadaten hielt, wie in this question erklärt.Garbage Collection für interne Strings, String Pool und perm-space
Ich habe auch über die String.intern()
Methode gelesen und dass es String
s in den String-Pool platziert einen Verweis auf eindeutige Instanz davon zurückgibt. Es ist mein Verständnis, dass dies der gleiche String-Pool ist, der String-Literale enthält, die im JMM-Raum der JVM existieren. Es schien mir nicht möglich zu sein, dass der "Perm-Raum" modifizierbar sein könnte, (er ist schließlich dauerhaft, ja?). Aber dann fand ich this question, wo die Top-Kommentar von EJP abgestimmt über die akzeptierte Antwort erklärt, dass
Intern'd Saiten wurden GC-able für einige ziemlich Jahren.
Implizieren, dass der GC auf dem Perm-Raum läuft, der nicht sehr dauerhaft scheint. Wie versöhnt sich das? Prüft der GC alles im Perm-Raum? Prüft der GC alles im String-Pool einschließlich String-Literale von der Quelle? Gibt es einen zweiten String-Pool für interne Strings? Kann der GC beim Sammeln nur interne Strings betrachten? Oder ist dieser Kommentar falsch und interniert eine Zeichenfolge verhindert, dass es jemals GC'd (was ich hoffe, ist nicht der Fall) ist?