2013-08-09 19 views
7

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 StringLiterale 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?

Antwort

7

Zeichenfolgenliterale are interned. Ab Java 7 stellt die HotSpot JVM interne Strings in den Heapspeicher, nicht permgen.

Vor Java 7, Hotspot setzen interned Strings in Permgen. Jedoch, interned Strings in permgen were garbage collected. Anscheinend, Class objects in permgen are also collectable, so ist alles in Permgen sammelbar, obwohl Permgen Sammlung möglicherweise nicht in einigen alten JVMs standardmäßig aktiviert ist.

String-Literale, die intern gespeichert werden, wären eine Referenz, die vom deklarierenden Class-Objekt zum String-Objekt im internen Pool gehört. Der interne literale String würde also nur dann gesammelt werden, wenn das Klassenobjekt, das sich darauf bezieht, ebenfalls erfasst wurde.