我正在开发一个相当大的应用程序,负责进行实时运动跟踪和摄像机移动控制。它的任务是:
该应用程序使用.NET 4.0并具有WPF用户界面。
管理线程冻结
从一开始我们就不得不面对冻结500到1500毫秒的托管线程,这对于像这样的实时应用来说非常重要。
为了找出这些挂起的时间,我创建了一个线程,其唯一的任务就是始终保持100ms的睡眠状态。然后,我计算了睡眠真正花了多长时间,并确切地确定了摄像机运动停止的时间。它工作非常可靠,线程都同时挂起!
非托管线程不会冻结
虽然所有托管线程都冻结了非托管线程,但没有任何问题。我们通过独立于应用程序的托管部分编写的日志来检查。
分析
我试图找出现象可能会导致这种行为:
如何调查这一点的提示将受到高度赞赏。非常感谢你!
答案 0 :(得分:1)
也许GC正在运作? 请参阅好文章:http://samsaffron.com/archive/2011/10/28/in-managed-code-we-trust-our-recent-battles-with-the-net-garbage-collector
答案 1 :(得分:1)
我建议您在遇到性能问题时进行进程转储。您可以通过多种方式执行此操作(来自SysInternals的taskmgr.exe或procdump.exe)。进行完整的内存转储。
获得.dmp文件后,可以使用windbg(或Visual Studio 2010)进行分析。对于托管进程,您需要加载sos.dll扩展。
那里有很多很好的windbg资源,但这里有一些帮助我:
1)Tess Fernandez video(ASP.NET过程,但技术相同)
当您遇到问题时,内存分析将能够为您提供堆栈(!clrstack
)并告诉您确切的罪魁祸首。