以下是.NET应用程序的一些日志输出。
Error in MainFunction.
Message: Exception of type 'System.OutOfMemoryException' was thrown.
InnerException:
StackTrace: at System.Text.StringBuilder.ToString()
at System.Diagnostics.StackTrace.ToString(TraceFormat traceFormat)
at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Exception.GetStackTrace(Boolean needFileInfo)
at System.Exception.ToString(Boolean needFileLineInfo)
at System.Exception.ToString()
[the rest of the trace is removed]
这对应于以下应用程序代码行。以下是catch块,并将字符串返回到实际抛出的方法:
private void MainFunction()
{
...
try
{
string doc = CreateXMLDocument(); // <- Out of Memory throws here
}
catch (Exception ex)
{
CoreLogging("Error in MainFunction.", ex);
}
}
private string CreateXMLDocument()
{
try
{
//Some basic and well constrained XML document creation:
...
}
catch (Exception ex)
{
return "Exception message: " + ex.ToString(); // <- This is the last line of the trace
}
}
我该怎么做?显然应该使用Exception.Message
代替Exception.ToString()
,但我仍然希望了解这一点。确实
意味着CreateXMLDocument中异常的堆栈跟踪是如此庞大造成OutOfMemory?我很想知道如何发生这种情况,因为在CreateXMLDocument中肯定没有循环调用,这是我能想到的唯一可能导致巨大堆栈跟踪的东西。
还有其他人遇到类似的情况吗?
答案 0 :(得分:3)
我有点猜测:
1)CLR引发OutOfMemoryException。 2)您捕获此异常并在其上调用.ToString
3)ToString()
尝试将内存分配给堆栈跟踪但是...没有内存而另一个OutOfMemoryException
已经升级。
在评论中,您说XML文档有几百KB,如果您的服务器运行在32位上,这个可能是一个问题,因为LOH碎片化。