当应用程序的内存使用量超过1.3GB时,我的c#应用程序中出现Out Of Memory异常.
我在具有3GB内存的32位机器上遇到了同样的问题,当时它是有道理的,但现在我将硬件升级到具有16GB内存的64位机器,高端主板和RAM但内存不足1.3GB之后仍然会发生异常!
我知道没有超过2GB的单个对象,而且无论如何1.3都不到2GB,因此单个对象的内置MS 2GB限制不太可能是问题...
当应用程序达到某个内存使用阈值时,似乎有某种类型的Windows kill-switch ...那么应该有一种方法可以在注册表中配置它吗?
任何帮助将不胜感激!
我写了以下功能
public void TestSB()
{
string str = "The quick brown fox jumps over the lazy dog.";
StringBuilder sb = new StringBuilder();
int j = 0;
int len = 0;
try
{
for (int i = 0; i < (10000000 * 2); i++)
{
j = i;
len = sb.Length;
sb.Append(str);
}
Console.WriteLine("Success ::" + sb.Length.ToString());
}
catch (Exception ex)
{
Console.WriteLine(
ex.Message + " :: " + j.ToString() + " :: " + len.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想,这个stringbuilder有能力超过20亿字符(准确地说是2,147,483,647).
但是当我运行上面的函数时,它只是在达到大约8亿的容量时给出了"System.OutOfMemoryException".而且,我在具有相同内存和相似负载量的不同PC上看到了截然不同的结果.
任何人都可以提供或解释我的原因.
有没有办法在运行时获得有关 OutOfMemoryException 的更多详细信息?或者,这个异常能否以某种方式不被封闭的 try/catch 捕获,而是一个 try/catch 更高的调用堆栈?我无法使用 WinDBG 进行复制,因此它必须是我可以从应用程序登录的内容。
对于冗长的解释,我深表歉意,但有很多可能的原因需要消除,我对此进行了解释。
我已经阅读了 OutofMemoryException 的所有可能性,并基本上消除了所有这些可能性。通常,应用程序运行良好,但有时仅在某些计算机上,我会收到 OutOfMemoryException。由于这些报告在现场无法在本地重现,因此我只有日志可以查看。但我有相当多的细节。
奇怪的是:
最近在应用程序的不同部分发生了几次。第一次,我断定存在损坏的 .NET 程序集,因为异常发生在它第一次加载 System.Web.Serialization 程序集时。我可以确定它是在第一次使用该程序集的方法调用期间发生的。重新映像计算机(与原始设置相同)和更新 Windows 解决了此问题。
但是,在我看来,在几天内发生的第二种情况(不同的客户)也是腐败的可能性很小。这种情况发生在不会加载任何程序集的位置。我现在正在重新考虑第一个错误。我所知道的:
有一些 COM 对象的用途。然而,在正常情况下,我们运行应用程序数周没有内存问题,当我们得到这些异常时,它们几乎立即发生,仅使用大约 20 个相对轻量级的 COM …
我试图创建以下数组
int numOfArrays = 50000;
int lengthOfArrays = 13500;
long[,] unsortedNumbers = new long[numOfArrays,lengthOfArrays];
Run Code Online (Sandbox Code Playgroud)
但我不断得出一个记忆异常.我瞄准x64,我相信我设置了大地址感知标志,看到图片,但我仍然得到错误.奇怪的是,我在同一个程序中有一个列表,消耗16gig的ram而没有任何问题.
系统:
64gig ram
高清100g免费.
当我尝试使用CsvHelper将非常多的数据(具有30万行及更多行的列表)写入内存流时,它将引发异常“ System.IO.IOException:流太长”。。
数据类相当大,具有约30个属性,因此文件中的每个记录将具有约30列。
这是实际的写代码,其中的异常抛出(这段代码是基于这样说 CsvHelper LIB的作者的回答):
using (var memoryStream = new MemoryStream())
{
using (var streamWriter = new StreamWriter(memoryStream, encoding ?? Encoding.ASCII))
{
var csvWriter = new CsvWriter(streamWriter, GetConfiguration(delimiter, mappingClassType, mappingActions));
csvWriter.WriteRecords(data); //data is IEnumerable<T> and has more than 300k records
streamWriter.Flush();
return memoryStream.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,将结果字节数组保存到文件中。
File.WriteAllBytes(filePath, resultedBytesArray);
Run Code Online (Sandbox Code Playgroud)
请注意,当我向文件写入100 000条记录时,相同的代码会很好地工作(在这种情况下,文件的大小约为1GB)。顺便说一句,我的目标是写出60万条数据记录。
这是与此问题相关的堆栈跟踪的相关部分。
Stream was too long.|System.IO.IOException: Stream was too long.
at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean …Run Code Online (Sandbox Code Playgroud)