Java では、文字列はその不変性とインターンの特性により、メモリ管理において独自の役割を果たします。これらの概念はパフォーマンスを向上させるだけでなく、面接でしばしば重要となる記憶処理に微妙なニュアンスをもたらします。
文字列プールと JVM メモリ管理がこれらの概念とどのように相互作用するかについてメモしながら、ガベージ コレクション と 不変性 について詳しく見てみましょう。
この投稿は、文字列プールとメモリ管理に関する前の記事で説明した概念に基づいています。最初にその記事を確認すると、ここで取り上げるトピックを理解するための役立つ基礎が得られます。
Java では、文字列リテラルはガベージ コレクション (GC) に関して異なる動作をします。
1.文字列プール内の参照されていないリテラル
String string3 = "World"; // Stored in String Pool // A new string is created in the pool due to case-sensitivity string3 = "WORLD";
この例では、string3 が 再割り当てされていても、元の「World」はまだ文字列プール内にあります。
JVM は、参照されていないリテラルをプールに保持し、将来の再利用を可能にしますが、これらのリテラルは通常のヒープ オブジェクトのようにガベージ コレクションの対象になりません。
2.ヒープ オブジェクト
String str1 = new String("World"); // Stored in Heap // String Pool reference is used now // leaving the previous "World" eligible for GC in Heap str1 = "WORLD";
new で作成されると、文字列は文字列プール ではなく ヒープに移動します。
str1 と同様に参照が変更されると、ヒープ内の未使用の「World」文字列は参照されなくなるため、ガベージ コレクションできます。
Java の文字列は不変です。一度作成すると変更することはできません。 「変更」を行うと、既存の文字列オブジェクトが変更されるのではなく、新しい文字列オブジェクトが作成されます。
1.コンパイル時の連結 (リテラルによる最適化)
String string5 = "This" + "String";
リテラルを連結する場合、Java コンパイラーは コンパイル時 で連結を実行して最適化します。
結果の文字列 ("ThisString") は、ヒープを完全に回避して、文字列プールに直接保存されます。
このプロセスは、定数プールの折りたたみとしても知られています。
2.実行時連結 (最適化なし)
String string1 = "Hello"; string1 = string1 + "Hello"; // Stored in Heap
1 つ以上のオペランド が変数 (非リテラル) の場合、実行時 で連結が発生し、文字列プールに存在しないヒープ オブジェクトが生成されます。 .
例: 元の "Hello" リテラルはプールに残りますが、連結された "HelloHello" 文字列はヒープに格納され、元の "Hello" の不変性が確認されます。
3. concat() メソッドの使用
String string3 = "World"; // Stored in String Pool // A new string is created in the pool due to case-sensitivity string3 = "WORLD";
4. intern() メソッドの適用
String str1 = new String("World"); // Stored in Heap // String Pool reference is used now // leaving the previous "World" eligible for GC in Heap str1 = "WORLD";
プロセス:
まず、concat() 操作により、ヒープ に値「World Says Hello」を持つ新しい文字列が作成されます。これは string3 が最初に参照します。
intern() を呼び出すと、この値がすでに 文字列プール にあるかどうかがチェックされます。そうでない場合は、値をプールに追加し、そのプールされたインスタンスへの参照を返します。
intern() を呼び出した後、string3 は文字列のプールされたコピーを指します。アクティブな参照がなくなった元のヒープ インスタンスはガベージ コレクションの対象となり、不必要なメモリ使用量が削減されます。
以上が文字列: Java におけるガベージ コレクションと不変性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。