var a = new double[7000,7000];
FillValue(a,3);
看起來.Net並沒有在執行第一行後實際分配任何內存給a
。只有在運行FillValue
時纔會呼叫逐漸吃掉內存。 (大約400MB)爲什麼.net在初始化2d數組時分配內存?
任何人都可以提供關於它的更多細節嗎?我認爲a
默認初始化後填充0,它怎麼可能根本沒有記憶?
var a = new double[7000,7000];
FillValue(a,3);
看起來.Net並沒有在執行第一行後實際分配任何內存給a
。只有在運行FillValue
時纔會呼叫逐漸吃掉內存。 (大約400MB)爲什麼.net在初始化2d數組時分配內存?
任何人都可以提供關於它的更多細節嗎?我認爲a
默認初始化後填充0,它怎麼可能根本沒有記憶?
有兩種方法可以在Windows中「分配內存」:「保留」和「提交」內存。
任務管理器只顯示「物理內存使用歷史」; .NET VM在分配數組時顯然只使用保留內存,然後返回並提交使用的部分。
根據MSDN的說法,這種方式可以預留內存,而無需實際佔用內存(效率更高),並且可以預留內存「保留一定範圍的進程虛擬地址空間,而無需在內存或內存中分配任何實際物理存儲分頁文件在磁盤上「。這就是爲什麼任務管理器不顯示它。
您可以在MSDN上的VirtualAlloc
頁面上閱讀更多信息。
雖然這是一個實現細節,所以你不應該依賴它或任何東西。例如,單聲道虛擬機可能會有不同的表現。
我在想如果我們可以利用它來處理稀疏矩陣操作。 – colinfang
其實它分配內存,你可以在這裏看到:
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
(需要減小數組的大小,以防止對ideone的OutOfMemoryException
)
檢索當前認爲分配的字節數。
FWIW ideone使用Mono。 –
很好的例子,thx,今天學到了一種新方法:) – colinfang
你如何衡量它是否分配內存? –
@SethCarnegie不幸的是,我用了一種非常粗糙的方式......只是看看Windows任務管理器......並設置了斷點,循環運行幾次。每個'fill'都有400MB的內存容量。 – colinfang
這也可能是因爲操作系統。請參閱「內存組合」http://blogs.msdn.com/b/b8/archive/2011/10/07/reducing-runtime-memory-in-windows-8.aspx –