文字列オブジェクトとメモリ使用量を作成する方法

以下の分析に基づくのHotSpot VMの
注意以上jdk1.7以上二つの変更:

  1. 仮想マシンのメモリ、定数プールは、ヒープ方式に地区から転送されました。
  2. String.intern()は、この文字列オブジェクトの文字列定数プール、などが存在し、プール戻り定数参照のオブジェクトであれば、そうでない場合、文字列に定数プール参照を生成し、戻り参照を、よりもむしろその後、文字列定数プール(JDK1.6)にコピーされます。

新しいString

文字列がヒープで作成されたオブジェクト、Stringクラスにはコンストラクタは、次のコードは内部に簡略化することができ、パラメータを持って呼び出します。

String temp = "hello";  // 在常量池中
String str = new String(temp); // 在堆上

定数をプール「ハロー」が存在しない場合、このコードは2つの文字列オブジェクト、定数プール内の一時点、ヒープへSTR点、STR char値の内部ながら[] char値の定数プールにポイントを作成し[]。
そうでなければ、それだけでSTRを作成します。

代入することにより、文字列リテラルを作成します

ストリングS3 =「」
本は、文字列に直接参照スタックする場合は、定数プールは同じ文字列であるかどうかを見つけるために、
そうでない場合、文字列定数プールを生成し、次いで文字列へのスタックポインタで引用。

文字列定数スプライシング

コンパイルフェーズは、直接文字列になるために参加しました。
文字列strを=「JA」+「 VA」
コンパイル時には、ステートメントの文字列str =「JAVA」、その後、一定のプールを作成または参照するためには、「JAVA」があるかどうかを調べるために行くに直接組み込まれます。

String変数スプライシング

文字列S1 = baseStr +「01」
コールstringBuilder.appendは()ヒープ上に新しいオブジェクトを作成します。

文字列s2を=新しい文字列(「 」)+新しいString( 『』);
定数プールは、ヒープS2内のオブジェクトを作成するには、 『』、 『AA』を作成するために、注意が「AAを作成しません『』

最後のフィールドの場合は、コンパイル時定数を直接交換する(非最後のフィールドのために、実行時に割り当てプロセスです)。

列STR1 =ファイナル"A";
最終STR2の文字列= "VA";
列STR3 STR1 + = STR2、
コンパイル時に、直接文字列STR3 = "" + "で置き換え VA"は、 文字列STR3に再び置き換え=「AVA "

おすすめ

転載: www.cnblogs.com/ChengzhiYang/p/12402705.html