我正在分析"OutofMemory“异常的.dmp文件。对象会在内存中停留很长一段时间,那么有没有一个命令来检查垃圾收集是由SOS.dll还是so触发的?
发布于 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()解决了面向对象对象管理异常,那么这样做是正确的。
https://stackoverflow.com/questions/30825738
复制相似问题