Java Language Pool di stringhe e archiviazione heap


Esempio

Come molti oggetti Java, tutte le istanze String vengono create sullo heap, anche letterali. Quando la JVM trova un valore letterale String che non ha riferimenti equivalenti nell'heap, la JVM crea un'istanza String corrispondente nell'heap e memorizza anche un riferimento all'istanza String appena creata nel pool String. Qualsiasi altro riferimento allo stesso letterale String viene sostituito con l'istanza String precedentemente creata nell'heap.

Diamo un'occhiata al seguente esempio:

class Strings
{
    public static void main (String[] args)
    {
        String a = "alpha";
        String b = "alpha";
        String c = new String("alpha");

        //All three strings are equivalent
        System.out.println(a.equals(b) && b.equals(c));

        //Although only a and b reference the same heap object
        System.out.println(a == b);
        System.out.println(a != c);
        System.out.println(b != c);
    }
}

L'output di quanto sopra è:

true
true
true
true

Diagramma di heap Java e pool di stringhe Quando si usano le doppie virgolette per creare una stringa, prima cerca String con lo stesso valore nel pool String, se trovato restituisce solo il riferimento altrimenti crea una nuova stringa nel pool e quindi restituisce il riferimento.

Tuttavia, utilizzando un nuovo operatore, imponiamo la classe String per creare un nuovo oggetto String nello spazio heap. Possiamo usare il metodo intern () per metterlo nel pool o fare riferimento ad un altro oggetto String dal pool di stringhe con lo stesso valore.

Anche il pool di stringhe stesso viene creato nell'heap.

Java SE 7

Prima di Java 7, i valori letterali String venivano memorizzati nel pool costante di runtime nell'area del metodo di PermGen , che aveva una dimensione fissa.

Il pool di stringhe risiedeva anche in PermGen .

Java SE 7

RFC: 6962931

In JDK 7, le stringhe internate non sono più allocate nella generazione permanente dell'heap Java, ma sono allocate nella parte principale dell'heap Java (noto come generazioni giovani e meno recenti), insieme agli altri oggetti creati dall'applicazione . Questo cambiamento comporterà più dati residenti nell'heap principale di Java e meno dati nella generazione permanente e, pertanto, potrebbe richiedere la regolazione delle dimensioni dell'heap. La maggior parte delle applicazioni vedrà solo differenze relativamente piccole nell'utilizzo dell'heap a causa di questa modifica, ma applicazioni più grandi che caricano molte classi o fanno un uso massiccio del metodo String.intern() vedranno differenze più significative.