stop-the-world GC を使用し、メソッドで何らかの処理を行ったfinalize()
場合、すべてのスレッドが中断され、やりたいことを何でも実行でき、GC スレッドを除いてリソースをめぐって競合するスレッドはないと想定できますか?
質問する
232 次
2 に答える
4
いいえ、実際には複数のファイナライザー スレッドが同時に実行されている場合もあります。
Java言語仕様から、「ファイナライザーは任意の順序で、または同時に呼び出すことができます。」
于 2011-07-16T02:08:42.223 に答える
2
いいえ、できません-少なくとも私がホットスポットの実装を理解している限り:
少なくとも、マーク & スイープ GC ではこのように動作しますが、他のすべての実装でも同様であると確信しています。
スイープ フェーズの後、マークされていないファイナライズされたすべてのオブジェクトが、マーク ビットが設定された状態でワーク リストに追加されます。
次に、バックグラウンド ワーカーがこのリストを処理し、1 つのファイナライズ コールで終了した後、次の GC でクリアされるようにマーク ビットをクリアします。この結果として、finalize メソッドがいつ呼び出されるかを推測することはできません (実際には、バックグラウンド スレッドも停止している可能性が高いため、GC の実行中ではないことは確実です!)。
これは Hotspot の実装の詳細であり、異なる GC 実装間で異なる場合さえあります..
于 2011-07-16T02:08:37.710 に答える