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

本文关键字:是否 文件 转储 检查 dll SOS 有没有 | 更新日期: 2023-09-27 17:56:19

我正在分析.dmp文件中的"内存不足"异常。对象在内存中保留了很长时间,那么是否有命令来检查垃圾回收是否是使用 SOS.dll 或 SOSEX 触发的?

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

在您提到的评论中

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

如果对象在第 2 代中,

则垃圾回收至少运行 2 次,否则它将在第 0 代中。

既然您知道了,很明显这些信息并没有真正的帮助。你想知道为什么它保留在内存中。

要找出哪个引用将大对象保留在内存中,请使用 SOS 命令 !gcroot 。当您知道这一点时,请查看您的代码以找出此类引用的来源或应将其删除的位置。

如果不再有引用,则对象可能很快就会被释放,并且它只是活动状态,因为此后没有发生第 2 代垃圾回收。在IDisposable上看到这个伟大的答案,它讨论了释放大型对象的意义。

在您的情况下,甚至可以在释放引用后调用GC.Collect()。通常你不应该篡改垃圾回收,但是如果你总是有这么大的对象,并且你肯定知道不再需要这个对象,并且GC.Collect()解决了 OOM 异常,那么这是正确的做法。