.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赋值,在任务管理器里面是无法看到起内存使用的。
    image
    1. Win10 X64,2G可用/4G总内存,VS2015,X86/DEBUG编译,在1.4G之后出错
    imageimage
    2. Win10 X64,2.6G可用/4G总内存,VS2015,X86/DEBUG编译,在1.5G之后出错
    image
    3. Win10 X64,2.6G可用/4G总内存,VS2015,X86/DEBUG编译,同时运行2个,各自在1.4G/1.5G出错
    image
    image
    4. Win10 X64,2G可用/4G总内存,VS2015,X64/DEBUG编译,在把内存和虚拟内存耗尽前都不会出错之后出错
    image
    image
    后面其实还有内存消耗到4.3G以上的时候但是因为内存耗尽,太卡了没法截图。
  • 实验分析
    1.若不对数组进行赋值,在任务管理器里面是无法看到起内存使用的。
    2.X86模式,可使用的内存极限大概在1.4G到1.6G,而不是上述的1.2G。
    3.X64模式,在把内存和虚拟内存耗尽前都不会出错之后出错,类似于C++的new,而不是2.4G。

posted @ 2016-01-15 20:22  夏至千秋  阅读(2937)  评论(0编辑  收藏  举报