GCルートとローカル変数
-
29-10-2019 - |
質問
タイマーのドキュメントを見ながらこのコメントで次の例に出くわしました: ジェネラコディセタグプレ
これは、C#のGCが、副作用がある場合でもローカル変数をガベージコレクションできることを意味しますか?おそらく、後でタイマーに再びアクセスしていないため、GCはそれを早く収集できますか?
これを正しく理解していれば、私がそのような最適化のファンであるかどうかはわかりません(ただし、おそらく理解していません;))
解決
はい、GCは、変数の最後の使用後すぐに、スコープの終了前にローカル変数を収集することがあります。メソッドの最後にgc.keepaliveを入れることで、キープアライブコールがあるまで変数が「存在する」になることを保証します。
C#は命令的な言語であるため、GCは副作用について何も知るように設計されていません。
他のヒント
GCを理解している限り、次のGCサイクルでガベージコレクションの候補として不要になったと思われる変数またはオブジェクトにマークを付けます。ここで特定のアプリケーションを理解できるかどうかはわかりませんが、GCがまだ必要なときにリソースを収集対象としてマークする場合があることは知っています(ただし、コードの記述方法により、そのようには表示されません)。
通常、メソッドの間、オブジェクトまたは変数はメソッド呼び出しの間スコープ内にとどまりますが、メソッド呼び出しがGCサイクル間の時間より長く続く場合、GCはTimerオブジェクトをスコープ外とマークしてマークする可能性がありますコレクション用です。GC.KeepAliveメソッドを追加すると、GCはメソッドが終了するまで待機してからTimerオブジェクトを操作します。