0

我正在通过 DebugDiag 中的转储分析调试我们的一个应用程序的挂起问题。长时间运行(1-2 小时)的 .Net 控制台应用程序并非始终如一地进入一种状态,即它似乎什么都不做但不退出(即挂起)。它正在运行的 VM 上有大量资源,而且它消耗的内存永远不会超过可用内存的 1/4。分析详细说明了线程正在等待什么:

The following threads in "SomeApp.exe_Manual Dump.dmp" are waiting for .net garbage collection to finish. Thread 20 triggered the garbage collection.
( 11 13 16 17 18 19 22 24 25 26 27 )
30.56% of threads blocked (11 threads)

第二组线程像这样:

The following threads in "SomeApp.exe_Manual Dump.dmp" are waiting in System.Threading.Monitor.Wait
( 0 14 28 29 30 31 )
16.67% of threads blocked (6 threads)

我对这篇文章的问题是,这是否表明垃圾收集器 (GC) 已被阻止,或者是否可能存在其他问题?需要注意的是,该过程似乎无限期地挂起,有时在我们注意到并杀死/重新启动它之前几个小时。如果 GC 被阻止,我将如何确定使用 dmp 为什么以及在什么对象上?我已经检查了代码,并且任何对象都没有最终确定,我知道这可能是一个来源。也许也有帮助,在 DebugDiag 的“.NET 线程摘要”部分中,只有 1 个线程具有非零 (1)“锁定计数”。

非常感谢您对此的任何想法或建议。

提前致谢!

4

0 回答 0