言語としてC#を使用した.NETFrameworkを使い始めたところです。私はJavaでのGCの概念をある程度理解しており、今日.NETで同じ概念を再検討しました。
C#では、値の型がスタックに配置されます(Javaの場合と同じように、ローカル変数がスタックに配置されます)。しかし、C#ではstruct
、値型にも含まれています。したがって、struct
sもスタックに配置されます。最悪のシナリオでは、多くのメソッド呼び出しがあり、スタックに多くのメソッドが大量に存在し、各メソッドには多くのローカル値タイプがあり、struct
それ自体に多くのローカル値タイプがある多くのsは、ガベージコレクターに影響を与えます。スタック?私が研究したこと(そして部分的に私が教えられたこと)から、私はそれがそうしないことを理解しています。主な理由は、スタックコンテンツの操作には多くのオーバーヘッドが伴うためです。さらに、GCはスタックを参照して参照を検索するだけであり、それ以上のことはありません。
同じトピックに関連する別の質問を追加するだけです。GCへの呼び出しを強制する(System.gc()
Javaの場合のように、C#に相当するものについてはわかりません)が、GCルーチンがその場で呼び出されることを保証しません。では、そのような呼び出しをどこにかける必要がありますか?GCを実行する必要があると予想される場所、または呼び出しがすぐにGCをトリガーする保証がないため、ランダムな場所ですか?それとも、ランタイム環境に任せて、気にしないでください。
注:そこから概念をリンクしようとしているため、Javaタグを追加しました。2つの別々のランタイム環境でのGCの内部機能は間違いなく異なることを理解していますが、基本的な概念は同じだと思います。