有人可以帮忙吗? 在使用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兆字节都可以,超过该限制我的“新字符串”会抛出内存异常。
为什么?
答案 0 :(得分:1)
你正在耗尽记忆力。您可能尚未分配所有可用内存,但此程序已将进程虚拟地址空间分段。最终,分配器无法找到连续的内存块来满足您的分配请求。
您的解决方案将是以下之一:
另请注意,您的测试分配的字符串占用的空间是您想象的两倍。您的字节数组被视为ANSI并转换为UTF-16。它从8位元素扩展到16位元素。