文字列がコンパイル時にリテラルとして定義されている場合[例:String str = "java";
]、ガベージコレクションされますか?
おそらくそうではありません。String
コードオブジェクトには、リテラルを表すオブジェクトへの1つ以上の参照が含まれます。コードオブジェクトが到達可能である限り、オブジェクトは到達可能になりString
ます。
コードオブジェクトが到達不能になる可能性がありますが、動的にロードされた場合に限り、クラスローダーが破棄されます。
インターン方式[例:String str = new String("java").intern()
]を使用した場合、ガベージコレクションは行われますか?
呼び出しによって返されるオブジェクトは、文字列リテラルintern
を表す同じオブジェクトになります。"java"
("java"
リテラルはクラスのロード時にインターンされます。次にString
、コードスニペットで新しく構築されたオブジェクトをインターンすると、以前にインターンされた"java"
文字列が検索されて返されます。)
ただし、文字列リテラルと同一ではないインターン文字列は、到達不能になるとガベージコレクションされる可能性があります。PermGenスペースは、最近のすべてのHotSpotJVMでガベージコレクションされます。(Java8より前...PermGenを完全に削除します。)
また、ポイント1の文字列リテラルとは異なる方法で処理されます。
いいえ...文字列リテラルと同じオブジェクトであるため。
実際、何が起こっているのかを理解すれば、文字列リテラルも特別に扱われないことは明らかです。これは、「到達可能性」ルールの単なる適用です...
String
クラスがアンロードされるときにのみリテラルがガベージコレクションされると言われている場所がいくつかありますか?String
クラスがアンロードされることはないと思うので、それは理にかなっていますか。
あなたが正しいです。それは意味がありません。それが間違っていると言った情報源。(彼らが私たち自身のために言っていることを私たちが読むことができるようにあなたがURLを投稿したならそれは役に立ちます...)