8
 var a = new double[7000,7000];

 FillValue(a,3);

a最初の行を実行した後、.Netは実際にはメモリを割り当てていないようです。FillValue呼び出しを実行している間だけ、徐々にメモリを消費します。(約400MBです)

誰かがそれに関する詳細を教えてもらえますか? デフォルトの初期化後に 0 で満たされていると思っaていましたが、どうしてメモリがまったく必要ないのでしょうか?

4

2 に答える 2

9

Windows で「メモリを割り当てる」方法には、メモリを「予約する」方法と「コミットする」方法の 2 つがあります。

タスク マネージャーには、「物理メモリ使用履歴」のみが表示されます。.NET VM は、配列を割り当てるときに予約済みメモリのみを使用するようで、使用された部分を元に戻してコミットします。

このようにして、実際にメモリを使用せずにメモリを予約できます。これはより効率的であり、MSDN によると、メモリを予約すると、「メモリまたはディスク上のページング ファイルに実際の物理ストレージを割り当てることなく、プロセスの仮想アドレス空間の範囲を予約します。 "。そのため、タスク マネージャーには表示されません。

詳細については、VirtualAllocMSDN のページを参照してください。

ただし、これは実装の詳細であるため、それに依存するべきではありません。たとえば、Mono VM は異なる動作をする可能性があります。

于 2012-10-23T21:22:16.483 に答える
7

実際には、次のようにメモリが割り当てられます。

http://ideone.com/Cd4BR1

Console.WriteLine("Memory before: {0}",GC.GetTotalMemory(true));
var a = new double[5000,5000];
Console.WriteLine("Memory after: {0}",GC.GetTotalMemory(true));

Memory before: 118784 
Memory after: 200224768

(オンイデオンを防ぐために配列のサイズを小さくする必要がありましたOutOfMemoryException

GC.GetTotalMemory方法

現在割り当てられていると考えられるバイト数を取得します。

于 2012-10-23T21:22:29.157 に答える