据我所知,.NET中的单个实例有2 GB的限制.我没有太多关注,因为到目前为止我主要使用32位操作系统.在32但它或多或少是一个人为的限制.但是,我很惊讶地发现这个限制也适用于64位.NET.
由于诸如List<T>使用数组来存储项目之类的集合,这意味着与在64位上运行的相同应用程序相比,在32位上运行的.NET应用程序将能够在列表中保存两倍的引用类型项.这非常令人惊讶.
有谁知道这个限制是否在CLR 4.0中得到解决(目前我手头没有安装4.0).
垃圾回收器可以为.NET进程分配的最大内存是多少?当我编译为x64时,Process.GetCurrentProcess.MaxWorkingSet返回大约1,4GB,但是当我编译到AnyCPU(x64)时,返回相同的数字.对于x64,它应该更像是任务管理器中显示的"限制"值.如何在所有情况下获得超出OutOfMemory-Exceptions的正确数字?
一些示例应该返回的方法:
1)机器配置:x64-Windows,4GB物理内存,4GB页面文件
- 作为64位进程:8GB
-As 32位进程:1.4GB
2)机器配置:x64-Windows,1GB物理内存,2GB页面文件
- 作为64位进程:3GB
-As 32位进程:1.4GB
3)机器配置:x32-Windows,4GB物理内存,4GB页面文件
- 作为64位进程:不会发生
- 作为32位进程:1.4GB
4)机器配置:x32-Windows,512MB物理内存,512MB页面文件
- 作为64位进程:不会发生
- 作为32位进程:1.0GB
在我的笔记本电脑上,运行64位Windows 7和2 Gb可用内存(由任务管理器报告),我能够做到:
var x = new Dictionary<Guid, decimal>( 30 * 1024 *1024 );
Run Code Online (Sandbox Code Playgroud)
没有一台拥有更多RAM的计算机,我想知道这是否会扩展,以便在具有4 Gb可用内存的计算机上,我将能够分配60M项而不是"仅"30M等等?
或者还有其他限制(.Net和/或Windows),在我能够消耗所有可用RAM之前我会遇到这些限制吗?
更新:好的,所以我不允许分配大于2 Gb的单个对象.知道这一点很重要!但是我当然很想知道我是否能够通过像这样分配2 Gb块来充分利用所有内存:
var x = new List<Dictionary<Guid, decimal>>();
for ( var i = 0 ; i < 10 ; i++ )
x.Add( new Dictionary<Guid, decimal>( 30 * 1024 *1024 ) );
Run Code Online (Sandbox Code Playgroud)
如果计算机有超过20Gb的可用内存,这会工作吗?