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 String
letterali 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)?