Javaの文字列が次のように宣言されているとします。String s = "hi"
上で作成したStringオブジェクトがガベージコレクションされるかどうかを知りたいだけですか?
と書くs = null
と、この時点でStringオブジェクトはガベージコレクションされますか?
Javaの文字列が次のように宣言されているとします。String s = "hi"
上で作成したStringオブジェクトがガベージコレクションされるかどうかを知りたいだけですか?
と書くs = null
と、この時点でStringオブジェクトはガベージコレクションされますか?
このようにすると、コンパイラはそれをリテラルプールに移動します。これで、「hi」のすべてのインスタンスがプール内のこの値に置き換えられます。これは、実際にはコンパイラがメモリ使用量を最適化する方法です。いいえ、これらの値がガベージコレクションされることはありません。ただし、実行時に作成されたStringオブジェクトはガベージコレクションされます。
JVM は、文字列リテラルを文字列定数プールにロードします。これは、javac または JIT コンパイラーによって行われません。オブジェクトへの参照がなくなると、この方法で定数プールにロードされた文字列を他のオブジェクトと同様に消去できます。これにはクラスをアンロードする必要がありますが、アプリケーションがこのように動作する場合に発生する可能性があります。