2012-10-23 52 views
8
var a = new double[7000,7000]; 

FillValue(a,3); 

看起來.Net並沒有在執行第一行後實際分配任何內存給a。只有在運行FillValue時纔會呼叫逐漸吃掉內存。 (大約400MB)爲什麼.net在初始化2d數組時分配內存?

任何人都可以提供關於它的更多細節嗎?我認爲a默認初始化後填充0,它怎麼可能根本沒有記憶?

+4

你如何衡量它是否分配內存? –

+0

@SethCarnegie不幸的是,我用了一種非常粗糙的方式......只是看看Windows任務管理器......並設置了斷點,循環運行幾次。每個'fill'都有400MB的內存容量。 – colinfang

+1

這也可能是因爲操作系統。請參閱「內存組合」http://blogs.msdn.com/b/b8/archive/2011/10/07/reducing-runtime-memory-in-windows-8.aspx –

回答

9

有兩種方法可以在Windows中「分配內存」:「保留」和「提交」內存。

任務管理器只顯示「物理內存使用歷史」; .NET VM在分配數組時顯然只使用保留內存,然後返回並提交使用的部分。

根據MSDN的說法,這種方式可以預留內存,而無需實際佔用內存(效率更高),並且可以預留內存「保留一定範圍的進程虛擬地址空間,而無需在內存或內存中分配任何實際物理存儲分頁文件在磁盤上「。這就是爲什麼任務管理器不顯示它。

您可以在MSDN上的VirtualAlloc頁面上閱讀更多信息。

雖然這是一個實現細節,所以你不應該依賴它或任何東西。例如,單聲道虛擬機可能會有不同的表現。

+1

我在想如果我們可以利用它來處理稀疏矩陣操作。 – colinfang

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 

(需要減小數組的大小,以防止對ideone的OutOfMemoryException

GC.GetTotalMemory Method

檢索當前認爲分配的字節數。

+1

FWIW ideone使用Mono。 –

+3

很好的例子,thx,今天學到了一種新方法:) – colinfang

相關問題