C# 在通过SOS.dll分析转储文件时,是否有方法检查是否触发了垃圾回收
我正在分析.dmp文件中的“OutofMemory”异常。对象在内存中停留了很长时间,因此是否有命令检查垃圾收集是否是通过使用SOS.dll或SOSEX触发的?在您提到的注释中 当我查看转储时,我看到一个特定的对象停留在第2代中,几乎占据了500+MB,因此我想检查垃圾收集是否运行 如果在Gen 2中有一个对象,则垃圾收集至少运行了2次,否则它将在Gen 0中运行 现在你知道了,很明显这些信息并没有真正的帮助。你想知道为什么它会留在记忆中 要找出哪个引用将大对象保留在内存中,请使用SOS命令C# 在通过SOS.dll分析转储文件时,是否有方法检查是否触发了垃圾回收,c#,debugging,garbage-collection,sos,sosex,C#,Debugging,Garbage Collection,Sos,Sosex,我正在分析.dmp文件中的“OutofMemory”异常。对象在内存中停留了很长时间,因此是否有命令检查垃圾收集是否是通过使用SOS.dll或SOSEX触发的?在您提到的注释中 当我查看转储时,我看到一个特定的对象停留在第2代中,几乎占据了500+MB,因此我想检查垃圾收集是否运行 如果在Gen 2中有一个对象,则垃圾收集至少运行了2次,否则它将在Gen 0中运行 现在你知道了,很明显这些信息并没有真正的帮助。你想知道为什么它会留在记忆中 要找出哪个引用将大对象保留在内存中,请使用SOS命令!g
!gcroot
。当您知道这一点时,请检查您的代码,以找出此类引用的来源或应该删除的位置
如果不再有引用,该对象可能很快就会被释放,它只是处于活动状态,因为此后没有发生第2代垃圾回收。请参阅关于IDisposable的,其中讨论了释放大型对象的意义
在您的情况下,它将在释放引用后重新启动。通常,您不应该篡改垃圾收集,但是如果您总是有一个如此大的对象,并且您肯定知道不再需要这个对象,并且
GC.Collect()
解决了OOM异常,那么这是正确的做法。为什么不在代码上运行memprofiler?您可以从查看开始!RootObjects
而不是触发集合。@YuvalItzchakov:好的,那么这如何帮助我理解是否触发了集合?1-你说的“触发”是什么意思?比如,有过吗?或者想知道它是否在GC的中间?2-你为什么想知道这个?3-你怎么知道对象在内存中停留了“很长时间”?@SteveJohnson:当我查看转储时,我看到一个特定的对象停留在第2代,几乎占据了500+MB,所以我想检查垃圾收集是否运行。