【问题标题】:why doesn't .net allocate memory when initialize a 2d array?为什么.net 在初始化二维数组时不分配内存?
【发布时间】:2012-10-23 21:16:32
【问题描述】:
 var a = new double[7000,7000];

 FillValue(a,3);

似乎.Net 在执行第一行之后实际上并没有为a 分配任何内存。只有在运行FillValue 调用时,它才会逐渐吃掉内存。 (大约 400MB)

任何人都可以向我提供有关它的更多详细信息吗?我还以为a默认初始化后是0,怎么可能不占内存呢?

【问题讨论】:

  • 你如何衡量它是否分配内存?
  • @SethCarnegie 可悲的是,我使用了一种非常粗略的方式......只需查看 Windows 任务管理器......并设置断点,循环运行几次。每个fill 有 400MB 内存,很容易发现。
  • 这也可能是操作系统的原因。请参阅“内存组合”blogs.msdn.com/b/b8/archive/2011/10/07/…
  • @ta.speot.is 请记住,这仅与 Windows 8 有关。我认为这与这次讨论无关。

标签: c# memory multidimensional-array


【解决方案1】:

在 Windows 中有两种“分配内存”的方法:“保留”和“提交”内存。

任务管理器只显示“物理内存使用历史”;当你分配一个数组时,.NET VM 显然只使用保留的内存,然后返回并提交被使用的部分。

通过这种方式,您可以在不实际占用的情况下保留内存,这样效率更高,并且根据 MSDN,保留内存“保留了进程的虚拟地址空间范围,而无需在内存或分页中分配任何实际的物理存储磁盘上的文件”。这就是任务管理器不显示它的原因。

您可以在 MSDN 上的 VirtualAlloc 页面上阅读更多相关信息。

虽然这是一个实现细节,所以你不应该依赖它或任何东西。例如,Mono VM 的行为可能会有所不同。

【讨论】:

  • 我在考虑是否可以在处理稀疏矩阵操作时利用它。
【解决方案2】:

实际上它会分配内存,如您在此处看到的:

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

检索当前认为分配的字节数。

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2012-11-29
    相关资源
    最近更新 更多