1

Immutable String に関する多くの Q&A で、次の操作を行うと JVM が実際に新しい参照を作成すると言っています。

String text = "apple";
text = "orange"; // a new reference is created

私の質問は、前の参照「リンゴ」はどうなりますか? Java Garbage Collection は自動であるため、メモリを再利用する意図的な方法がないということですか?

編集:私がこの質問をしている理由は、将来、文字列変数をどのように処理すればよいか知りたいからです。

文字列リテラルは GC によってクリアされますか? そうでない場合、メモリ不足になるまでプールが非常に大きくなるのではないでしょうか? プログラムが UI のテキスト ボックスから異なる文字列値を受け取るかどうかを考慮すると、ユーザーが入力するそれぞれの異なる値がプールに追加されます。

4

3 に答える 3

3

意図的にメモリを再利用する方法はありませんSystem.gc()(これは JVM への単なる提案です)。

ガベージ コレクションが実行されても、「apple」が回収されるとは限りません。

JLS 3.10.5によると、文字列リテラルは文字列プールに保持されるため、ガベージ コレクションは行われません

引用:

文字列リテラルは、クラス String (§4.3.1、§4.3.3) のインスタンスへの参照です。

さらに、文字列リテラルは常に String クラスの同じインスタンスを参照します。

これは、文字列リテラル (より一般的には、定数式の値である文字列 (§15.28)) が、メソッド String.intern を使用して一意のインスタンスを共有するために「インターン」されているためです。

編集

この回答によると、インターンされた文字列でさえガベージコレクションできます。

于 2013-05-09T17:28:18.947 に答える
2

いいえ、GC を強制的に実行することはできません。認識することが重要なことの 1 つは、"apple"文字列が破棄されないことです。これは文字列リテラルとして宣言されているため、文字列プールに移動します。

于 2013-05-09T17:27:02.533 に答える
1

完全に逆参照されたオブジェクトを明示的に再利用する方法はありません。を呼び出すことはできますがSystem.gc();、これは gc を実行するための単なる提案であり、gc が実行されることを保証するものではありません

于 2013-05-09T17:25:22.837 に答える