首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何诊断System.OutOfMemoryException?

如何诊断System.OutOfMemoryException?
EN

Stack Overflow用户
提问于 2010-09-13 20:47:16
回答 8查看 8.2K关注 0票数 9

上周五我在下班前运行了一些代码,周一我在这里,它停止了一个OutOfMemoryException。我估计整个过程需要进行数百亿次的计算,所以这不是一个小任务。

我甚至不知道如何开始修复这个问题。

有什么建议吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-09-13 20:52:49

好吧,考虑到您提供的contet,或者它的缺失,我只能在这里提供一些一般的想法:首先,最明显的答案是看看异常本身中包含的信息,这应该会让您了解代码分配失败的地方。

其次,您使用内存分析来更好地了解您的应用程序中发生了什么-我是dotTrace的用户,但可能有免费的替代方案可用。

除了这个概述之外,你可能想在你的问题中包括一些更多的信息。你在分配什么类型的对象,什么时候分配,你是否在使用本机资源等。

票数 9
EN

Stack Overflow用户

发布于 2010-09-13 20:56:39

Eric Lippert的这篇文章可能会有所帮助:“Out Of Memory” Does Not Refer to Physical Memory

票数 9
EN

Stack Overflow用户

发布于 2010-09-13 21:03:12

最简单、最直接的解决方案是:

  1. 使用procdump (包含在Sysinternals Suite中)在进程达到某个不合理的大小时对其进行完整的内存转储。
  2. 使用以下命令将转储加载到WinDbg中,并使用以下命令加载SOS调试扩展:!dumpheap -stat以查看哪种类型的对象占用了大部分内存。
  3. 使用几个实例转储(泄漏类型的)对象列表,并发出命令:!gcroot <OBJ_ADDRESS>。输出应该告诉您哪个对象仍然持有对它的引用,以及为什么没有释放该对象。

如果您怀疑泄漏的来源来自某些本机代码,可以通过发出以下命令来验证这一点:!eeheap -gc。输出将告诉您托管堆占用了多少内存。如果您的进程的私有工作集大小远远大于托管堆的大小,那么您可能存在本机泄漏(或者,可能由于某种原因,您产生了大量的线程,因此由于线程堆栈而导致空间耗尽。您可以通过发出以下命令:~*或:!threads来检查进程中产生了多少线程,以仅显示托管线程)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3700490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档