.NET的内存限制
之前做点云的.Net程序,经常因为数据量大出现Outofmemory异常,但是看看任务管理器,内存还有好多剩余的,在网上搜了一下发现这样的解释。
不管系统内存多大,目前一个.NET 对象最多只能够使用2G内存。
对于2G内存的服务器,.Net只能使用1.2G内存。
对于4G内存的服务器,.Net可使用2.4G内存。但系统需要进行如下设置:
1、 在boot.ini文件中增加/3GB的开关。
[boot loader]
timeout=3
default=multi(0)disk(0)rdisk(0)partition(2)/WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)/WINNT="????" /3GB
2、在命令行窗口,进入该目录,如 cd "C:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/bin"
3、运行link命令: link -edit -LARGEADDRESSAWARE server.exe (server.exe为你的.Net程序)
4、你的server.exe就可以使用到2.4G内存了
然而增加这一点并没有什么卵用!更重要的是,我通过实验取得的数据和这个不一致,结果和分析如下。
- 测试代码
int i = 0; List<double[]> buff = new List<double[]>(); try { for (i = 1; i < 1000; i++) { { double[] a = new double[(ulong)(1024 * 1024 * 1024 / 80.0 )]; for (int j = 0; j < a.Length; j++) { a[j] = i + j; } buff.Add(a); Console.WriteLine((0.1 * a[0]) + "G\t" + GC.GetTotalMemory(false) / 1024 / 1024.0); Console.ReadKey(); } GC.Collect(); } } catch(Exception e) { Console.WriteLine(e.ToString()); Console.WriteLine(i * 0.1 + "G"); }
- 测试结果
0.若不对数组a赋值,在任务管理器里面是无法看到起内存使用的。
1. Win10 X64,2G可用/4G总内存,VS2015,X86/DEBUG编译,在1.4G之后出错
2. Win10 X64,2.6G可用/4G总内存,VS2015,X86/DEBUG编译,在1.5G之后出错
3. Win10 X64,2.6G可用/4G总内存,VS2015,X86/DEBUG编译,同时运行2个,各自在1.4G/1.5G出错
4. Win10 X64,2G可用/4G总内存,VS2015,X64/DEBUG编译,在把内存和虚拟内存耗尽前都不会出错之后出错
后面其实还有内存消耗到4.3G以上的时候但是因为内存耗尽,太卡了没法截图。 - 实验分析
1.若不对数组进行赋值,在任务管理器里面是无法看到起内存使用的。
2.X86模式,可使用的内存极限大概在1.4G到1.6G,而不是上述的1.2G。
3.X64模式,在把内存和虚拟内存耗尽前都不会出错之后出错,类似于C++的new,而不是2.4G。