上周五我在下班前运行了一些代码,周一我在这里,它停止了一个OutOfMemoryException。我估计整个过程需要进行数百亿次的计算,所以这不是一个小任务。
我甚至不知道如何开始修复这个问题。
有什么建议吗?
发布于 2010-09-13 20:52:49
好吧,考虑到您提供的contet,或者它的缺失,我只能在这里提供一些一般的想法:首先,最明显的答案是看看异常本身中包含的信息,这应该会让您了解代码分配失败的地方。
其次,您使用内存分析来更好地了解您的应用程序中发生了什么-我是dotTrace的用户,但可能有免费的替代方案可用。
除了这个概述之外,你可能想在你的问题中包括一些更多的信息。你在分配什么类型的对象,什么时候分配,你是否在使用本机资源等。
发布于 2010-09-13 20:56:39
Eric Lippert的这篇文章可能会有所帮助:“Out Of Memory” Does Not Refer to Physical Memory
发布于 2010-09-13 21:03:12
最简单、最直接的解决方案是:
procdump (包含在Sysinternals Suite中)在进程达到某个不合理的大小时对其进行完整的内存转储。!dumpheap -stat以查看哪种类型的对象占用了大部分内存。!gcroot <OBJ_ADDRESS>。输出应该告诉您哪个对象仍然持有对它的引用,以及为什么没有释放该对象。如果您怀疑泄漏的来源来自某些本机代码,可以通过发出以下命令来验证这一点:!eeheap -gc。输出将告诉您托管堆占用了多少内存。如果您的进程的私有工作集大小远远大于托管堆的大小,那么您可能存在本机泄漏(或者,可能由于某种原因,您产生了大量的线程,因此由于线程堆栈而导致空间耗尽。您可以通过发出以下命令:~*或:!threads来检查进程中产生了多少线程,以仅显示托管线程)。
https://stackoverflow.com/questions/3700490
复制相似问题