var a = new double[7000,7000];
FillValue(a,3);
a
在执行第一行之后,.Net 似乎实际上并没有分配任何内存。只有在运行FillValue
调用时,它才会逐渐消耗内存。(大约 400MB)
任何人都可以向我提供有关它的更多详细信息吗?我以为a
默认初始化后都是0,怎么可能不占内存呢?
var a = new double[7000,7000];
FillValue(a,3);
a
在执行第一行之后,.Net 似乎实际上并没有分配任何内存。只有在运行FillValue
调用时,它才会逐渐消耗内存。(大约 400MB)
任何人都可以向我提供有关它的更多详细信息吗?我以为a
默认初始化后都是0,怎么可能不占内存呢?
在 Windows 中有两种“分配内存”的方法:“保留”和“提交”内存。
任务管理器只显示“物理内存使用历史”;当您分配数组时,.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
on ideone)
检索当前认为分配的字节数。