文字列が作成されたときにメモリ割り当てに関する多くの矛盾した記事を読んだ。 new演算子がヒープにStringを作成し、StringリテラルがString Pool [Heap]で作成されるとの記述がありますが、new演算子はヒープ内にオブジェクトを作成し、Stringプール内に別のオブジェクトを作成します。これを分析するために文字列作成と文字配列メモリ割り当て
iは文字列の文字列と文字列オブジェクトのハッシュコードを印刷する次のプログラムを書いた:
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);
}
}
このプログラム印刷次の出力:
Analyse s1
1569228633
778966024
Analyse s2
1569228633
1021653256
Analyse s3
1569228633
1794515827
Analyse s4
1569228633
1794515827
この出力一方からストリングがどのように作成されるかにかかわらず、ストリングが同じ値を持つ場合、それらは同じchar配列を共有するということは非常に明確です。
私の質問は、このchararrayがどこに格納されているか、ヒープに格納されているのか、それともpermgenに行くのでしょうか?また、私はヒープメモリアドレスとpermgenメモリアドレスを区別する方法を理解したい。
私が貴重な限られたpermgenスペースを食べるようにpermgenに格納されていると、大きな問題があります。 char配列がpermgenに格納されているのではなくヒープに格納されている場合は、文字列リテラルもヒープスペース[これまで読んでいないもの]を使用することを意味します。
Javaコンパイラは、あまりにも賢いです。 '' ... ... toCharArray() 'などを試してみてください。しかし、情報レベルはゼロになる。 –
[this](http://www.precisejava.com/javaperf/j2se/StringAndStringBuffer.htm)は役に立つかもしれません – Anirudha
もしあなたが 'StringBuilder'から' String'を構築したのであれば、おそらく別の文字列値の一部を追加するルーチン。 –