定数プールを仕上げ、文字列定数プール

以前の研究ビットJVMのメモリ部門、定数プールエリア乏しいの方法以来、あなたはそれを探検したいので、

これをより明確に書かれて見 
https://blog.csdn.net/tophawk/article/details/78704074(jdk1.8版) 
https://blog.csdn.net/youyou1543724847/article/details/52337257

参照して、ビット混沌に続いて、まだきちんと 
https://blog.csdn.net/zm13007310400/article/details/77534349 
https://www.cnblogs.com/holos/p/6603379.html 
HTTPS:/ /blog.csdn.net/qq_31142587/article/details/78203382

主な問題:

S1 =文字列「ABC」;
1
コンパイル時のチェック文字列定数プールは、ABC、ダイレクトリターンS1、ABCの参照、そうでない場合は、ABC、オブジェクトを作成するには、ABCのヒープと彼の参照のプール内の文字列定数の増加はプロセスでありました準備段階の後にABCのインスタンスを生成する前に証明言及実装するか、以下のコンパイル?それは、問題のJDK長いバージョンが原因である可能性があり?

メソッドおよび定数プールエリア
私たちはクラス、フィールド、メソッド、インターフェース、および定数プールのバージョンを保存していたメソッドエリア。

 
メソッド領域のクラスファイル下の図は、どのような情報を含むことを示します。 


クラスの定数プール
我々は、Javaクラスをコンパイルした後、それぞれを書き込み、クラスファイルを形成する;クラスバージョン、フィールド、メソッド、インターフェース、および他の記述的情報を含むクラスファイルに加えて、情報のプールがある定数(一定でありますコンパイルシンボリック参照(シンボリック参照)を記憶し、生成するためのプールテーブル)、種々のリテラル(リテラル);
リテラル前記テキスト文字列2. 3の8つの基本タイプの値は、最終的な宣言。定数等;
シンボリック参照が含まれます:クラス1完全修飾名、フィールド名と2属性、3属性の方法を....
各クラスは、クラスファイルの定数プールを併設しています。
クラスの定数プールは、各クラスのコンパイル時で、コンパイル時に、インスタンスは、それらがオブジェクトではなく存在すること、一定のシンボリック参照に格納されています。
運転領域時定数プールの方法
javaファイルの後には、クラスファイルにコンパイルされ、生成されます。つまり私は、上記のクラスの定数プールが言いました。そして、実行時定数プールは、それを生産する際のですか? 
クラスの実装では、JVMは、初期化、接続ロードされなければならない、との接続も検証、準備、分析三つの段階を含んでいます。そして、メモリにロードされたクラスの後、JVMはそのクラスの定数プールは、ランタイム定数プールに格納されます、別のクラスの定数プールがメモリ以降のバージョンにロードされているメモリ内の定数プールを、ランタイム場所:それのリテラルは、動的に追加することができます(文字列#インターン())、シンボリック参照を解決することができます直接参照。 
実行時定数プールクラスがロードされた後、各クラスの定数プール基準値ダンプ実行時定数プール、のシンボルが、各クラスは、クラスを解析した後、実行時定数プールを有します、直接参照、一貫したグローバル定数プールの基準値へのシンボリック参照を置き換えます。クエリの解析プロセスは、実行時定数プールの参照がグローバル文字列プールの文字列を引用することを確実にするために、我々は以下ますRESDLL.DLL呼んでグローバル文字列プールを、行くと同じです。

構文解析プロセスは、実行時定数プール引用符で囲まれた文字列と文字列定数プールは同じであることを保証するために、私たちますRESDLL.DLL上記されたクエリ文字列定数プールに行きます。

定数プールを持つクラスへのランタイム定数プールファイルの相対的なもう一つの重要な特徴は、ゾーン法を入力するには、コンテンツのクラスファイルの定数プールを事前に設定されていないこと、ダイナミック、Java言語のみを生成するためにコンパイル必ずしも一定を必要としないです動作中、実行時定数プールは、開発者はStringクラスのよりインターン()メソッドであり、この機能を活用する、プールに新たな定数であってもよいです。(リサーチ・インターン())

メリットの定数プール
頻繁に作成し、破壊したオブジェクトは、システムのパフォーマンスに影響を与えないようにするために一定のプール、共有オブジェクトの実装。 
例えば、コンパイル時に文字列定数プールは、一定のプールにすべての文字列リテラルを置くために。

保存メモリ空間:すべて同じ文字列定数定数プールがマージされ、一つだけのスペースを占めています。
すぐに文字列を比較する場合、==比は(等しい):時間を操作し保存。二つの基準変数について、唯一==基準平等は、実際の値が等しいかどうかを決定することができるか否かを判断します。
文字列定数プール
ストリング定数プールの記憶領域のJavaの位置で 
JDK6.0で以前では、文字列定数プールはパーマジェンゾーン(即ち、ゾーン法)であり;
JDK7.0バージョン文字列定数でプールは、ヒープに移動しました。おそらくメモリ空間法領域へのヒープ内の移動は、小さすぎる理由として。
置かれているものの文字列定数プール 
JDK6.0およびそれ以前のバージョンでは、文字列プール文字列定数を入れて
JDK7.0で、原因のString#インターン()が変更されているので、文字列プールに格納することができます杭文字列オブジェクト参照プットは 
文字列定数プールは1つだけです。ことに留意すべきです!
ケース

S1 =文字列「こんにちは、世界!」;
文字列s2を=「こんにちは、世界!」;
。1
2
「!こんにちは、世界」完成されたコードの最初の行、既存の参照定数プールを実行した後、次にs2はありません定数プールは、新しいスペースのために、しかし、直接S2に戻り、既存の文字列のメモリアドレスに適用されます。

グローバル文字列定数プールその後、ヒープ内の準備段階は、文字列オブジェクトのインスタンスを生成した後に、実績のある、クラスの内容がにロードされ、そして(ある、文字列定数プール、私はそれが世界のすべてのクラスで共有さだけを強調していると思います)文字列プールに格納されている文字列オブジェクトインスタンスの基準値は(覚えて:文字列のプールは、基準値の代わりに、オブジェクトの特定のインスタンスに格納され、オブジェクトは、ストレージ・スペースのオープンヒープの具体的な例です。)。クラスでのHotSpot VMますRESDLL.DLLに実装された文字列プール機能は、ハッシュ・テーブルが常駐文字列を保持、(ハッシュ学習を追加)である(つまり、私たちはしばしば言う二重引用符います)この参照によって、いくつかの文字列インスタンスのヒープはますRESDLL.DLLが「常駐文字列」アイデンティティを与えられたと同等になった後と言うことです、(代わりに文字列自体のインスタンスを常駐している)参照。これますRESDLL.DLLのみ、各インスタンスのHotSpot VM内の1つの、そしてすべてのクラスによって共有されています。 

列A = "ABC";
列B = "ABC";
System.out.println(== B)。
1
2
3
答案为真

A =文字列「ABC」;
のSystem.out.println(A ==「ABC」);
1。
2
答えが偽で 
分析:最初のインスタンス化「ABC」が参照文字列と定数プールJVMに格納されています。 
定数プールは定数と実行時定数プールタイムコンパイルプールに分割され 
、「ABC」で、このコードが割り当てられていない==「ABC」を、JVMが動作文字列定数を最適化する文字列がない宣言されていませんコンパイル時の定数プールで、実行時定数プールに文字列のインスタンスのみを実行している、およびコンパイラの定数プールを宣言されている場合にのみ、それが偽です。印刷する戻りましょう(== b)は//真印刷このコードは、JVMのコンパイル時間をスキップすることができるので、印刷実行中に定義された、「ABC」が得られ、比較アドレス、結果が出力されます真。
 

公開された19元の記事 ウォンの賞賛149 ビュー800 000 +

おすすめ

転載: blog.csdn.net/truelove12358/article/details/101435038