为什么.net在初始化2d数组时没有分配内存?
var a = new double[7000,7000]; FillValue(a,3);
似乎.Net在执行第一行后实际上并没有为a
分配任何内存。 只有在运行FillValue
调用时才会逐渐占用内存。 (约400MB)
任何人都可以向我提供有关它的更多细节吗? 在默认初始化之后,我认为a
填充为0,怎么可能根本没有内存?
在Windows中“分配内存”有两种方法:“保留”和“提交”内存。
任务管理器仅显示“物理内存使用历史”; .NET VM在分配数组时显然只使用了保留内存,然后返回并提交使用过的部分。
根据MSDN,这样就可以保留内存而不实际占用内存,效率更高,并保留内存,“保留一系列进程的虚拟地址空间,而无需在内存或磁盘上的页面文件中分配任何实际的物理存储空间”。 这就是任务管理器不显示它的原因。
您可以在MSDN上的VirtualAlloc
页面上阅读有关它的更多信息。
这是一个实现细节,所以你不应该依赖它或任何东西。 例如,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
(需要减小数组的大小以防止对ideone的OutOfMemoryException
)
GC.GetTotalMemory
方法
检索当前认为要分配的字节数。
- 我可以在一行中从DBNull转换为Nullable Bool吗?
- 在财产上发射一个事件/function? (C#)
- HttpContext.Current.User.Identity.IsAuthenticated返回false
- 无法反序列化当前的JSON对象(例如{“name”:“value”})
- 使用AngularJS和ASP.NET Web API上载/下载字节数组
- 无法找到请求的.Net Framework数据提供程序。 程序(SqlClient)
- ASP.NET MVC5从布局访问ViewBag?
- 如何识别是否打开文件夹?
- Linq ToList / ToArray / ToDictionary性能