2013-08-09 16 views
7

Dopo aver esplorato gli interni di stringa di java, mi sono confuso su quello che viene definito "spazio perm". Inizialmente ho capito che conteneva i valori Stringletterali nonché i metadati di classe come spiegato in this question.Garbage collection su stringhe intern'd, String Pool e perm-space

Ho anche letto sul metodo String.intern() e che inserisce String nel pool di stringhe restituendo un riferimento a un'istanza univoca di esso. Sono a conoscenza del fatto che questo è lo stesso pool di stringhe contenente stringhe letterali stringa presenti nello perm-space della JVM. Non mi è sembrato possibile che il "perm-space" potesse essere modificabile (è permanente, dopo tutto, sì?). Ma poi ho trovato this question dove la cima votato commento di EJP sulla risposta accettata spiega che

stringhe Intern'd sono stati GC-in grado per ormai da diversi anni.

Comprendendo che il GC gira sullo perm-space che non sembra molto permanente. Come si concilia questo? Il GC controlla tutto nello spazio perm-space? Il GC controlla tutto nel pool di stringhe inclusi i letterali stringa dalla sorgente? Esiste un secondo pool di stringhe per stringhe internate? Il GC sa solo di guardare le stringhe interne durante la raccolta? O questo commento è errato e internare una stringa gli impedisce di essere sempre GC (che spero non sia il caso)?

risposta

7

Stringhe letterali are interned. A partire da Java 7, la JVM HotSpot inserisce stringhe internamente nell'heap, non in permgen.

Prima di java 7, l'hotspot inserisce stringhe internate in permgen. Tuttavia, interned Strings in permgen were garbage collected. Apparentemente, Class objects in permgen are also collectable, quindi tutto ciò che è permesso in permgen è collezionabile, anche se la collezione permgen potrebbe non essere abilitata di default in alcune vecchie JVM.

I valori letterali stringa, essendo internati, sarebbero un riferimento detenuto dall'oggetto Class di dichiarazione all'oggetto String nel pool interno. Quindi la stringa letterale internata verrebbe raccolta solo se venisse anche raccolto l'oggetto Class che si riferiva ad esso.