文字列: Java におけるガベージ コレクションと不変性

DDD
リリース: 2024-11-07 08:13:03
オリジナル
755 人が閲覧しました

Strings: Garbage Collection and Immutability in Java

Java では、文字列はその不変性インターンの特性により、メモリ管理において独自の役割を果たします。これらの概念はパフォーマンスを向上させるだけでなく、面接でしばしば重要となる記憶処理に微妙なニュアンスをもたらします。

文字列プールと JVM メモリ管理がこれらの概念とどのように相互作用するかについてメモしながら、ガベージ コレクション不変性 について詳しく見てみましょう。

この投稿は、文字列プールとメモリ管理に関する前の記事で説明した概念に基づいています。最初にその記事を確認すると、ここで取り上げるトピックを理解するための役立つ基礎が得られます。


1.文字列ガベージコレクション

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」文字列は参照されなくなるため、ガベージ コレクションできます


2. 文字列の不変性

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";
ログイン後にコピー
ログイン後にコピー
  • concat() メソッドは、オペランドが リテラルであるか変数であるかに関係なく、常にランタイム連結を実行し、新しい文字列をヒープに配置します。

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 開発者はメモリ効率が高く、パフォーマンスの高いコードを作成できます。


関連記事

    Java の基礎
  • アレイインタビューの必需品
  • Java メモリの基礎
  • Java キーワードの基礎
  • Java OOP の基本
  • コレクション フレームワークの基本
コーディングを楽しんでください!

以上が文字列: Java におけるガベージ コレクションと不変性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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