メモリ値型と参照型を解放するときに、ガベージ コレクターが値型と参照型でどのように動作するか。私はこれについて少し混乱しています。誰もがこれについて説明できます。同時に、ガベージコレクターは値型または参照型のメモリを解放します。
2 に答える
あなたは問題を間違った方法で考えています。「値型」と「参照型」について考えるのはやめましょう。代わりに、変数について考え始め、それらの変数が短命か長命かを考えてみましょう。
ガベージ コレクション ヒープの目的は、有効期間が長い変数に関連付けられているストレージを再利用することです。スタック の目的は、有効期間が短い変数に関連付けられたストレージを再利用することです。
人々は「値の型はスタックに置かれる」とか「参照はヒープに置かれる」などとあなたに伝えようとしますが、これはナンセンスで混乱を招きます。 変数はスタックまたはヒープ (またはレジスター -- 誰もがレジスターのことを忘れています) に配置され、変数は値型または参照型にすることができます。
「ガベージ コレクターが最初に削除するのはどれですか?」と尋ね続けます。その質問には答えられません。ガベージ コレクション ヒープは、メモリが再利用される順序について一切保証しません。有効期間の短いストレージ (スタック) は、アクティブ化フレームがスタックから取り出されるときに再利用されます。ただし、C# 言語では、参照が再びアクセスされないとランタイムが判断できる場合、ガベージ コレクターは、フレームがスタックからポップされる前に、有効期間が短いストレージによって参照されるストレージをクリーンアップできます。基本的に、いつストレージが再利用されるかは、ランタイムの実装の詳細であり、いつでも変更される可能性があります。
ガベージ コレクターは、参照型のみに関係します。値型では何もしません。
値型はスタック上に存在する場合があります。その場合、メソッドが終了し、スタック ポインターが調整されると、それらのメモリが解放されます。値型は、参照型のフィールドとしてヒープ上に存在する場合もあります。その場合、メモリは参照型オブジェクトが GC によって収集されるときに回収されます。