7

メモリ値型と参照型を解放するときに、ガベージ コレクターが値型と参照型でどのように動作するか。私はこれについて少し混乱しています。誰もがこれについて説明できます。同時に、ガベージコレクターは値型または参照型のメモリを解放します。

4

2 に答える 2

26

あなたは問題を間違った方法で考えています。「値型」と「参照型」について考えるのはやめましょう。代わりに、変数について考え始め、それらの変数が短命長命かを考えてみましょう。

ガベージ コレクション ヒープの目的は、有効期間が長い変数に関連付けられているストレージを再利用することです。スタック の目的は、有効期間が短い変数に関連付けられたストレージを再利用することです。

人々は「値の型はスタックに置かれる」とか「参照はヒープに置かれる」などとあなたに伝えようとしますが、これはナンセンスで混乱を招きます。 変数はスタックまたはヒープ (またはレジスター -- 誰もがレジスターのことを忘れています) に配置され、変数は値型または参照型にすることができます。

「ガベージ コレクターが最初に削除するのはどれですか?」と尋ね続けます。その質問には答えられません。ガベージ コレクション ヒープは、メモリが再利用される順序について一切保証しません。有効期間の短いストレージ (スタック) は、アクティブ化フレームがスタックから取り出されるときに再利用されます。ただし、C# 言語では、参照が再びアクセスされないとランタイムが判断できる場合、ガベージ コレクターは、フレームがスタックからポップされる前に、有効期間が短いストレージによって参照されるストレージをクリーンアップできます。基本的に、いつストレージが再利用されるかは、ランタイムの実装の詳細であり、いつでも変更される可能性があります

于 2012-12-26T17:10:33.043 に答える
2

ガベージ コレクターは、参照型のみに関係します。値型では何もしません。

値型はスタック上に存在する場合があります。その場合、メソッドが終了し、スタック ポインターが調整されると、それらのメモリが解放されます。値型は、参照型のフィールドとしてヒープ上に存在する場合もあります。その場合、メモリは参照型オブジェクトが GC によって収集されるときに回収されます。

于 2012-12-26T10:29:49.967 に答える