3

重複の可能性:
ガベージコレクションとスレッド

インタビューでこの質問を受けました。複数のスレッドが作成されていると仮定すると、スレッドの1つがガベージコレクションを呼び出すと、他のスレッドの参照されていないオブジェクトも収集されますか?

4

1 に答える 1

12

はいといいえ。

スレッドの1つがガベージコレクションを呼び出す場合、他のスレッドの参照されていないオブジェクトも収集されますか?

はい。オブジェクトは「スレッド内」ではありません。プログラムで実行されているすべてのスレッドに対して単一のオブジェクトグラフがあるため、GCが発生すると、どのスレッドがオブジェクトを作成したか、またはオブジェクトへのローカル参照があったかに関係なく、到達不能なオブジェクトが収集されます。

いいえ。スレッドがVMを呼び出す場合Runtime.gc()、VMは実際に何もする義務がないため、GCが発生せず、メモリが収集されない可能性があります。たとえば-XX:+DisableExplicitGC、コマンドラインでが指定されている場合は効果がありません。

Runtime.gc()

このメソッドを呼び出すと、Java仮想マシンは、現在占有しているメモリをすばやく再利用できるようにするために、未使用のオブジェクトのリサイクルに労力を費やしていることがわかります

いいえ。GCが発生した場合でも、世代別GCはオブジェクトグラフのサブセットのみを処理し、そのサブセットに作成されたすべての到達不能オブジェクトが含まれている場合、1つのスレッドのスタックからのみ到達可能であったすべての到達不能オブジェクトが必ずしも収集されるわけではありません。特定のスレッドによって、それは偶然です。

于 2013-01-28T03:45:30.360 に答える