Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在通过SOS.dll分析转储文件时,是否有方法检查是否触发了垃圾回收_C#_Debugging_Garbage Collection_Sos_Sosex - Fatal编程技术网

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

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

我正在分析.dmp文件中的“OutofMemory”异常。对象在内存中停留了很长时间,因此是否有命令检查垃圾收集是否是通过使用SOS.dll或SOSEX触发的?

在您提到的注释中

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

如果在Gen 2中有一个对象,则垃圾收集至少运行了2次,否则它将在Gen 0中运行

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

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

如果不再有引用,该对象可能很快就会被释放,它只是处于活动状态,因为此后没有发生第2代垃圾回收。请参阅关于IDisposable的,其中讨论了释放大型对象的意义


在您的情况下,它将在释放引用后重新启动。通常,您不应该篡改垃圾收集,但是如果您总是有一个如此大的对象,并且您肯定知道不再需要这个对象,并且
GC.Collect()
解决了OOM异常,那么这是正确的做法。

为什么不在代码上运行memprofiler?您可以从查看
开始!RootObjects
而不是触发集合。@YuvalItzchakov:好的,那么这如何帮助我理解是否触发了集合?1-你说的“触发”是什么意思?比如,有过吗?或者想知道它是否在GC的中间?2-你为什么想知道这个?3-你怎么知道对象在内存中停留了“很长时间”?@SteveJohnson:当我查看转储时,我看到一个特定的对象停留在第2代,几乎占据了500+MB,所以我想检查垃圾收集是否运行。