none
为何64位的.NET程序不能申请超过2G的空间? RRS feed

  • 问题

  • 如题,我在最新的Visual Studio 2012 RC和.NET 4.5下,确认使用了64位的子系统,写了如下代码:

    static void Main(string[] args)
    {
        var arr = new byte[0x7FFFFFFF];
    }

    但是总是提示“OutOfMemoryException”,请问是怎么回事?


    The light is my strength

    2012年8月14日 3:53

答案

  • 你将数组值改小一点。(小于2G)

    多申请几个试试。


    family as water

    • 已标记为答案 Flysha 2012年8月16日 2:04
    2012年8月16日 1:07
  • 事实证明,真是如此,每次申请内存时,内存的大小必须小于2G,但是总共加起来的大小可以远远超过2G:

    var arr1 = new byte[0x70000000];
    var arr2 = new byte[0x70000000];
    var arr3 = new byte[0x70000000];
    for (int i = 0; i < 0x70000000; ++i)
    {
        arr1[i] = (byte)(i & 0xFF);
        arr2[i] = (byte)(i & 0xFF);
        arr3[i] = (byte)(i & 0xFF);
    }
    


    The light is my strength

    • 已标记为答案 Flysha 2012年8月16日 2:04
    2012年8月16日 2:04

全部回复

  • 1.你机器内存足够么?

    2.是否是x64平台配置?


    family as water

    2012年8月14日 6:04
  • 我是64位的系统,内存超过4G,且确认我是面向64位的子系统进行编译


    The light is my strength

    2012年8月14日 8:08
  • 内存碎片太多,每块都不满2G,虽然碎片加起来可能超过2G了,而且由于程序本身占用的内存也算在2G里,所以提示不够。

    family as water

    2012年8月15日 2:51
  • 您的意思是不是:既使是在64位的平台,CLR也只能使用最多2G的空间,对吗?
    如果不对,那如何才能使用超过2G的空间呢?

    (在C++中,我可以使用new int[0xFFFFFFFF]直接分配16G的内存,但C#中不行)


    The light is my strength


    • 已编辑 Flysha 2012年8月15日 9:45
    2012年8月15日 9:45
  • 你将数组值改小一点。(小于2G)

    多申请几个试试。


    family as water

    • 已标记为答案 Flysha 2012年8月16日 2:04
    2012年8月16日 1:07
  • 事实证明,真是如此,每次申请内存时,内存的大小必须小于2G,但是总共加起来的大小可以远远超过2G:

    var arr1 = new byte[0x70000000];
    var arr2 = new byte[0x70000000];
    var arr3 = new byte[0x70000000];
    for (int i = 0; i < 0x70000000; ++i)
    {
        arr1[i] = (byte)(i & 0xFF);
        arr2[i] = (byte)(i & 0xFF);
        arr3[i] = (byte)(i & 0xFF);
    }
    


    The light is my strength

    • 已标记为答案 Flysha 2012年8月16日 2:04
    2012年8月16日 2:04
  • 这个是数组本身限制。


    family as water

    2012年8月16日 6:15
  • 在.NET 4.0及以前的版本,不论32位还是64位的Windows上的托管程序都不能创建大于2GB的对象

    在.NET 4.5中,您可以通过修改<gcAllowVeryLargeOjbects>来在64位操作系统上启用大于2G的数组。但是数组元素的最大数量依旧有限制(UInt32.MaxValue)


    共同努力,共同提高
    kaedei#live.cn My BLOG


    • 已编辑 Kaedei 2012年8月21日 3:10
    2012年8月21日 3:09