JAVAにおける文字列定数プールとバッファプールの理解と役割の詳細な分析

WBOY
リリース: 2022-03-18 17:24:45
転載
2807 人が閲覧しました

この記事では、java に関する関連知識を提供します。主に文字列定数プールとバッファー プールの理解と役割を紹介します。文字列プールと定数プールはまったく異なります。2 つのことがあり、多くの場所があります。混同しやすいので初心者の方には誤解を招きやすいので、ここでは皆さんのお役に立てればと思い、丁寧に解説していきたいと思います。

JAVAにおける文字列定数プールとバッファプールの理解と役割の詳細な分析

推奨学習: 「java 学習チュートリアル

文字列プールは 文字列定数プール とも呼ばれます, この名前が誤解の元だと思います. string の 3 つの単語を省略して、constant pool だけを残す人もいます。文字列オブジェクトのキャッシュ プールを呼び出すだけです。 String pool

1 Constant pool

Constant プールは 2 つのタイプに分かれており、1 つは static です。 1 つは .class ファイル内の定数プール で、もう 1 つは .class ファイル内の静的定数プールを JVM にロードすることによって形成される 実行時定数プール#です。

1.1 静的定数プール

.class ファイル内の定数プールは配列とみなすことができます。一部の定数は配列に格納されます。バイトコードで必要な場合は、命令 この定数が使用される場合、配列のインデックスを通じてアクセスされます。

次のコードを見てください:

 String m = "hellohellohellohellohello";
 String n = "hellohellohellohellohello";
ログイン後にコピー
バイトコードでは次のようになります:

 // 常量池:
 #1 hellohellohellohellohello
 #2 ...
 ...
 ----------------------------
 
 String m = #1;
 String n = #1;
ログイン後にコピー
もちろん、これは単なる簡略化されたバージョンであり、実際にはもっと複雑です(実際のバージョンについては、この記事の最後にあるリファレンス セクションに回答が掲載されています。今のところは、簡略化されたバージョンのみを考慮してください)

これに格納されている文字列定数は単なる文字列定数であることに注意してください。単純な UTF8 Java 文字列オブジェクトではなく、エンコードされたバイト シーケンスです。これは、txt テキストに保存する文字列と同じです。UTF8 形式を使用して .class ファイルを開くと、

hellohellohellohellohello が表示されます。解析対象:

1.2 ランタイム定数プール

静的定数プールを理解すると、ランタイム定数プールを理解するのが簡単になります。簡単に言えば、ランタイム定数プールは、JVM の .class ファイル内の静的定数プールのランタイム表現です。.class ファイル内の各静的定数プールは、対応するランタイム定数プールを生成します。 JVM は命令

String m = #1 を解釈するときに、このクラスのランタイム定数プールに移動して #1 の定義を見つけることができます。

2 文字列プール

文字列プールは、

String オブジェクトを再利用するために Java によって設定されたキャッシュ プールであり、Java 1.7 より前ではメソッド領域に設定され、保存されていました。これは String オブジェクトです。Java 1.7 以降はヒープ上に設定され、String オブジェクトへの参照を保存します。String オブジェクト自体はヒープ上の別の場所に存在します。以下では Java 1.7 以降の状況を標準とします。

上記の例を続けます。 JVM が String m = #1 を解釈しているとき、ランタイム定数プールから対応する UTF8 シーケンスを取得しています。次に、この UTF8 シーケンスに対応する String オブジェクトを文字列プールで検索し、オブジェクトの参照を追加します。 mに割り当てられました。この String が作成されるタイミングが気になるかもしれませんが、この R の記事によると、このステートメントが配置されているクラスがロードされるときに、対応するオブジェクトがすでに文字列プールに存在する場合は何も行われません。が存在しない場合は、対応する String オブジェクトが作成され、その参照がプールに配置されます。

文字列プールに加えて、

IntegerLong などのラッパー タイプにも独自のキャッシュ プールがあります。 -128~127 のキャッシュ Integer オブジェクト、リテラル代入または Integer.valueOf() を使用する場合、対応するオブジェクトがプール内に存在する場合、プール内のオブジェクトが返されます。プール内にそのようなオブジェクトが存在しない場合にのみ、新しいオブジェクトがヒープ上に作成されます。 ただし、文字列プールとは異なり、これらの Wrapper プールは文字列プールのように増加しません。つまり、プール内のオブジェクトの数は固定されており、Integer プールには -128 ~ 127 のみが存在します。 . .

基本型に対応するバッファ プールは次のとおりです:

boolean values true and false
 all byte values
 short values between -128 and 127
 int values between -128 and 127
 char in the range \u0000 to \u007F
ログイン後にコピー

jdk 1.8 のすべての数値バッファ プールの中で、整数バッファ プール IntegerCache は非常に特殊です。このバッファの下限はプールは - 128、上限です。デフォルトの制限は 127 ですが、この上限は調整可能です。JVM を開始するときに、-XX:AutoBoxCacheMax= を通じてこのバッファ プールのサイズを指定します。このオプションは、実行時に java.lang という名前のファイルを設定します。 JVM が初期化され、.IntegerCache.high システム プロパティが設定され、IntegerCache の初期化時にシステム プロパティが読み取られて上限が決定されます。

推奨学習: 「

Java チュートリアル

以上がJAVAにおける文字列定数プールとバッファプールの理解と役割の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート