首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法在通过SOS.dll分析转储文件时检查是否触发了垃圾收集

有没有办法在通过SOS.dll分析转储文件时检查是否触发了垃圾收集
EN

Stack Overflow用户
提问于 2015-06-14 11:41:12
回答 1查看 456关注 0票数 0

我正在分析"OutofMemory“异常的.dmp文件。对象会在内存中停留很长一段时间,那么有没有一个命令来检查垃圾收集是由SOS.dll还是so触发的?

EN

回答 1

Stack Overflow用户

发布于 2015-10-16 20:45:04

在你提到的评论中

当我查看转储时,我看到一个留在第2代的特定对象几乎占用了500+ MB,因此我想检查垃圾收集是否运行。

如果你在Gen 2中有一个对象,那么垃圾回收至少运行2次,否则它将在Gen 0中。

现在你已经知道了,很明显,这些信息并没有真正的帮助。你想知道为什么它会留在内存中。

要找出哪个引用将大对象保存在内存中,请使用SOS命令!gcroot。当你知道这一点时,检查你的代码,找出这样的引用是从哪里来的,或者应该从哪里删除。

如果没有更多的引用,对象可能很快就会被释放,它只会存活,因为从那以后就没有发生过第二代垃圾回收。请参阅IDisposable上的this great answer,其中讨论了释放大型对象的要点。

在您的例子中,它在释放引用之后执行might even be ok to call GC.Collect()。通常,您不应该篡改垃圾收集,但是如果您总是拥有如此大的对象,并且您肯定知道不再需要该对象,并且GC.Collect()解决了面向对象对象管理异常,那么这样做是正确的。

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

https://stackoverflow.com/questions/30825738

复制
相关文章

相似问题

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