var a = new double[7000,7000];
FillValue(a,3);
a
最初の行を実行した後、.Netは実際にはメモリを割り当てていないようです。FillValue
呼び出しを実行している間だけ、徐々にメモリを消費します。(約400MBです)
誰かがそれに関する詳細を教えてもらえますか? デフォルトの初期化後に 0 で満たされていると思っa
ていましたが、どうしてメモリがまったく必要ないのでしょうか?
var a = new double[7000,7000];
FillValue(a,3);
a
最初の行を実行した後、.Netは実際にはメモリを割り当てていないようです。FillValue
呼び出しを実行している間だけ、徐々にメモリを消費します。(約400MBです)
誰かがそれに関する詳細を教えてもらえますか? デフォルトの初期化後に 0 で満たされていると思っa
ていましたが、どうしてメモリがまったく必要ないのでしょうか?
Windows で「メモリを割り当てる」方法には、メモリを「予約する」方法と「コミットする」方法の 2 つがあります。
タスク マネージャーには、「物理メモリ使用履歴」のみが表示されます。.NET VM は、配列を割り当てるときに予約済みメモリのみを使用するようで、使用された部分を元に戻してコミットします。
このようにして、実際にメモリを使用せずにメモリを予約できます。これはより効率的であり、MSDN によると、メモリを予約すると、「メモリまたはディスク上のページング ファイルに実際の物理ストレージを割り当てることなく、プロセスの仮想アドレス空間の範囲を予約します。 "。そのため、タスク マネージャーには表示されません。
詳細については、VirtualAlloc
MSDN のページを参照してください。
ただし、これは実装の詳細であるため、それに依存するべきではありません。たとえば、Mono VM は異なる動作をする可能性があります。
実際には、次のようにメモリが割り当てられます。
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
)
現在割り当てられていると考えられるバイト数を取得します。