“new string”抛出内存异常

时间:2013-12-10 16:30:51

标签: c# memory-management out-of-memory

有人可以帮忙吗? 在使用xml序列化时,我遇到了内存异常,同时尝试分配大量内存块,例如使用“new string(< 170MB>)”

这是我的测试程序,它显示了分配问题:

using System;
using System.Text;
namespace Out_of_memory_Exception
{

class Program
{
    static Encoding MyEncoding = Encoding.Default;
    static string Position = "";

    static void Main(string[] args)
    {
        System.Console.WriteLine("Out of memory Exception-Test:");

        const int MEGABYTE = 1024*1024;
        for(long i=10*MEGABYTE; ; i+=10*MEGABYTE)
        {
            try
            {
                System.Console.Write("{0} MB: ", i/(1024*1024));
                Test(i);
                System.Console.WriteLine("OK");
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("{0} at {1}", ex.GetType().ToString(), Position);
            }
            if (i > (1000*MEGABYTE))
                i = 10*MEGABYTE;
        }
    }

    static void Test(long i)
    {
        Position = "new byte[i]";
        byte[] Bytes = new byte[i];

        Position = "Encoding.GetChars()";
        char[] Chars = MyEncoding.GetChars(Bytes);

        Position = "new string()";
        string s = new string(Chars);
    }
}
}

在我的盒子上,从10到140兆字节都可以,超过该限制我的“新字符串”会抛出内存异常。

为什么?

1 个答案:

答案 0 :(得分:1)

你正在耗尽记忆力。您可能尚未分配所有可用内存,但此程序已将进程虚拟地址空间分段。最终,分配器无法找到连续的内存块来满足您的分配请求。

您的解决方案将是以下之一:

  1. 分配更少的内存,即减少需求。
  2. 切换到64位进程和更大的盒子,即增加供应量。
  3. 以较小的块分配内存,即减少碎片。
  4. 另请注意,您的测试分配的字符串占用的空间是您想象的两倍。您的字节数组被视为ANSI并转换为UTF-16。它从8位元素扩展到16位元素。