0

クラス Foo にデストラクタを実装すると、Foo のインスタンスがファイナライズ キューで厳密に追跡されます。Foo のインスタンスがガベージ コレクションされると、CLR がファイナライズ キュー内のエントリを確認し、オブジェクトをヒープからファイナライズ到達可能テーブルに移動することで、そのオブジェクトに特別な処理を与えることを理解しています。その後...そのガベージコレクションサイクルで他に何も起こらないのですか?

finalize() は次のガベージ コレクション サイクル中に常に呼び出されますか?

オブジェクトを freachable テーブルにコピーした直後に finalize が呼び出されないのはなぜですか? (これは余分な不必要な複雑さのようです)

4

1 に答える 1

1

ファイナライザー キューは、物事を単純化するためにあります。それがなければ、より複雑になります。GC の実行時にマネージ コードを実行する必要はありません。そうしないと、ユーザー コードが途中で実行されると、GC が行ったすべての分析が無効になる可能性があります。

そのため、GC が実行されるときは、すぐに実行されるのではなく、ファイナライズを延期する必要があります。別のスレッドで実行すると、VM がすべてのスレッドへの排他的アクセスを必要とする時間が最小限に抑えられ、同時アクティビティの可能性が高まります。

于 2009-07-19T17:34:28.297 に答える