var a = new double[7000,7000];
FillValue(a,3);
看起来.Net在执行第一行后实际上并没有为a
分配任何内存。只有在FillValue
调用运行时,它才会逐渐吃掉内存。 (大约400MB)
有人可以向我提供有关它的更多详细信息吗?我认为a
在默认初始化后填充为0,怎么可能根本没有内存?
答案 0 :(得分:9)
在Windows中“分配内存”有两种方法:“保留”和“提交”内存。
任务管理器仅显示“物理内存使用历史记录”; .NET VM在分配数组时显然只使用了保留内存,然后返回并提交使用过的部分。
通过这种方式,您可以保留内存,而无需实际占用内存,效率更高,并根据MSDN保留内存,“保留进程的虚拟地址空间范围,而无需在内存或分页中分配任何实际的物理存储空间磁盘上的文件“。这就是任务管理器没有显示它的原因。
您可以在MSDN上的VirtualAlloc
页面上阅读更多相关信息。
这是一个实现细节,所以你不应该依赖它或任何东西。例如,Mono VM可能表现不同。
答案 1 :(得分:7)
实际上它会分配内存,你可以在这里看到:
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
)
检索当前认为要分配的字节数。