Ho letto molti articoli in conflitto relativi all'allocazione della memoria quando viene creato String. Alcuni articoli dicono che il nuovo operatore crea una stringa nell'heap e String letterale viene creato nel pool di stringhe [Heap] mentre alcuni dicono che il nuovo operatore crea un oggetto nell'heap e un altro oggetto nel pool di stringhe.Creazione di stringhe e char array Allocazione di memoria
Per analizzare questo ho scritto il seguente programma che stampa il hashcode di stringa char e String oggetto:
import java.lang.reflect.Field;
public class StringAnalysis {
private int showInternalCharArrayHashCode(String s)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
final Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
return value.get(s).hashCode();
}
public void printStringAnalysis(String s) throws SecurityException,
IllegalArgumentException, NoSuchFieldException,
IllegalAccessException {
System.out.println(showInternalCharArrayHashCode(s));
System.out.println(System.identityHashCode(s));
}
public static void main(String args[]) throws SecurityException,
IllegalArgumentException, NoSuchFieldException,
IllegalAccessException, InterruptedException {
StringAnalysis sa = new StringAnalysis();
String s1 = new String("myTestString");
String s2 = new String("myTestString");
String s3 = s1.intern();
String s4 = "myTestString";
System.out.println("Analyse s1");
sa.printStringAnalysis(s1);
System.out.println("Analyse s2");
sa.printStringAnalysis(s2);
System.out.println("Analyse s3");
sa.printStringAnalysis(s3);
System.out.println("Analyse s4");
sa.printStringAnalysis(s4);
}
}
Questo programma stampa output seguente:
Analyse s1
1569228633
778966024
Analyse s2
1569228633
1021653256
Analyse s3
1569228633
1794515827
Analyse s4
1569228633
1794515827
Da questo un'uscita è chiaro che indipendentemente da come viene creata la stringa, se le stringhe hanno lo stesso valore condividono lo stesso array di caratteri.
Ora la mia domanda è dove è memorizzato questo chararray, è memorizzato in heap o va a permgen? Voglio anche capire come differire tra gli indirizzi di memoria heap e gli indirizzi di memoria permgen.
Ho un grosso problema se è memorizzato in permgen in quanto mangerà il mio prezioso spazio permgen limitato. e se il char array non è memorizzato in permgen ma in heap, allora implica che anche i letterali String usano lo spazio heap [che è qualcosa che non ho mai letto].
Il compilatore Java è semplicemente troppo intelligente. Prova '" ... ". ACharArray()' o simile. Ma poi il livello di informazione scende a zero. –
[questo] (http://www.precisejava.com/javaperf/j2se/StringAndStringBuffer.htm) potrebbe essere utile – Anirudha
Sarebbe più convincente se si costruisse un 'String' da un' StringBuilder', magari chiamando un altro routine per aggiungere parti del valore della stringa. –