javaで文字列がガベージコレクションされるのはいつ?
質問
Javaでは、オブジェクトがライブリファレンスを持っていないとき、それはガベージコレクションの対象となります。文字列の場合、文字列は文字列プールに入り、JVMは再利用のためにオブジェクトを生かし続けるので、この限りではありません。 つまり、一度作成された文字列は、「決して」ガベージコレクションされないということですか?
どのように解決するのでしょうか?
文字列の場合、文字列は文字列プールに入り、JVMは再利用のためにオブジェクトを維持するので、このケースには当てはまりません。つまり、一度作成された文字列は、「決して」ガベージ コレクションされないということですか?
まず、それは
だけ
文字列
リテラル
(注釈を参照) で、自動的にインターンされ、文字列プールに追加されます。
String
アプリケーションが実行時に作成したオブジェクトはインターンされません ... ただし、アプリケーションが明示的に
String.intern()
.
次に、実は文字列プールのオブジェクトをガベージコレクションするためのルールは、他の
String
オブジェクトと同じです。 GCが到達不可能であると判断した場合、それらはガベージコレクションされます。
実際には
String
文字列リテラルに対応するオブジェクト
は通常
はガベージコレクションの候補になることはありません。 これは
暗黙の
への参照があるからです。
String
オブジェクトへの暗黙の参照です。 これはつまり
String
はメソッドが実行される限り到達可能であることを意味します。
しかし、これは
常に
とは限りません。 文字列リテラルが動的に読み込まれるクラスで定義されていた場合 (例えば
Class.forName(...)
を使用)、そのクラスが
アンロード
. もしそうなった場合は
String
オブジェクトに対応するリテラル
は
は到達不能になり、最終的にGCされるかもしれません。
こちらもご覧ください。 Javaでクラスがガベージコレクションされるのはいつ、どのようにですか?
注意事項
-
文字列リテラル( JLS 3.10.5 ) は、以下のように表示される文字列です。 という文字列です。 と表示される文字列です。
"abc" // string literal new String(...) // not a string literal
-
(コンパイル時の)定数式( JLS 15.28 ) も内部化されるかもしれません。
"abc" + 123 // this is a constant expression
-
厳密に言えば、すべてのStringリテラルがインターンであるわけではありません。
-
String リテラルが定数式の部分式としてのみソースコードに現れる場合、そのリテラルは ".class" ファイルに現れないかもしれません。 どのような形であれ . このようなリテラルは実行時に存在しないため、インターンされません。
-
Java 9+では、リテラルとコンパイル時の定数でない値を含む文字列の連結は は は異なる方法で処理されます。 現在、バイトコードコンパイラのオプションで、以下のような文字列の連結が可能です。
int x = 42; // not a compile time constant String s = "prefix " + x + " suffix";
かもしれない のような文字列定数がインターネイトされることになります。
"prefix \1 suffix"
実行時には、上記の文字列定数は動的連結メソッドを生成するための "recipe" として使用されます。その際 オリジナル 文字列リテラル(すなわち
"prefix "
と" suffix"
) は内部で文字列オブジェクトにならないでしょう。を賞賛します。 ホルガー の指摘に感謝します。 より詳細な情報は JEP 280 と javadoc に対して
StringConcatFactory
.
-
-
Java 7 より前のバージョンでは、文字列プールは PermGen にありました。 Javaのいくつかのバージョンでは、PermGen のガベージコレクションは有効ではありませんでした。 デフォルトで CMS コレクターを選択した場合です。 しかし、CMS は決してデフォルトのコレクターではなく、CMS による PermGen 収集を有効にするフラグもありました。 (そして、もう誰も Java 6 以前のコードを開発してはいけません。)
関連
-
maven レポート エラー 解決不可能な親POM
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
プロジェクトの依存関係を解決できない。
-
無効なメソッド宣言
-
シェルコマンドやスクリプトのJavaコール
-
セミコロン期待値エラー解決
-
ジャバアレイ
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
1分でわかる!恋人の写真をIDEAの背景画像に設定する方法【おすすめ集
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.