Dav*_*veO 9 .net multithreading memory-leaks c++-cli
在性能监视器中监视我的.NET应用程序我可以看到.NET CLR LocksAndThreads /#当前逻辑线程随着时间的推移而稳步增长(当前为293),这表明线程堆栈正在泄漏.
我可以找到许多文章告诉我这是问题,但没有任何东西告诉我如何找到原因 - 那么我从哪里开始?Windbg可以告诉我问题出在哪里吗?
这是我3小时的性能监视器,告诉我当前的逻辑线程是150:
这是线程窗口的输出,这并没有告诉我太多因为我无法访问他们的调用堆栈 - 它们大多被标记为[不可用]或[在睡眠中,等待或加入] | [外部代码]:
Unflagged 141024 124 Worker Thread <No Name> Normal
Unflagged > 0 0 Unknown Thread [Thread Destroyed]
Unflagged 136272 2 Worker Thread <No Name> Highest
Unflagged 133060 7 Worker Thread vshost.RunParkingWindow [Managed to Native Transition] Normal
Unflagged 136952 10 Main Thread Main Thread [edited].Program.Main Normal
Unflagged 134544 9 Worker Thread .NET SystemEvents [Managed to Native Transition] Normal
Unflagged 136556 11 Worker Thread Worker Thread [edited].MessageService.ProcessJobs.AnonymousMethod__0 Normal
Unflagged 141364 113 Worker Thread <No Name> [In a sleep, wait, or join] Normal
Unflagged 140896 0 Worker Thread [Thread Destroyed] Normal
Unflagged 136776 19 Worker Thread <No Name> [In a sleep, wait, or join] Normal
Unflagged 135704 20 Worker Thread <No Name> [In a sleep, wait, or join] Normal
Unflagged 136712 21 Worker Thread <No Name> [In a sleep, wait, or join] Normal
Unflagged 134984 22 Worker Thread <No Name> [In a sleep, wait, or join] Normal
Unflagged 134660 23 Worker Thread Worker Thread [edited].BroadcastService.ProcessJobs.AnonymousMethod__1d Normal
Unflagged 140224 152 Worker Thread <No Name> Normal
Unflagged 140792 157 Worker Thread <No Name> Normal
Unflagged 137116 0 Worker Thread <No Name> Normal
Unflagged 140776 111 Worker Thread <No Name> Normal
Unflagged 140784 0 Worker Thread [Thread Destroyed] Normal
Unflagged 140068 145 Worker Thread <No Name> Normal
Unflagged 139000 150 Worker Thread <No Name> Normal
Unflagged 140828 52 Worker Thread <No Name> Normal
Unflagged 137752 146 Worker Thread <No Name> Normal
Unflagged 140868 151 Worker Thread <No Name> Normal
Unflagged 141324 139 Worker Thread <No Name> Normal
Unflagged 140168 154 Worker Thread <No Name> Normal
Unflagged 141848 0 Worker Thread [Thread Destroyed] Normal
Unflagged 135544 153 Worker Thread <No Name> Normal
Unflagged 142260 140 Worker Thread <No Name> Normal
Unflagged 141528 142 Worker Thread <No Name> [In a sleep, wait, or join] Normal
Unflagged 141344 0 Worker Thread [Thread Destroyed] Normal
Unflagged 140096 136 Worker Thread <No Name> Normal
Unflagged 141712 134 Worker Thread <No Name> Normal
Unflagged 141688 147 Worker Thread <No Name> Normal
Run Code Online (Sandbox Code Playgroud)
更新: 我已经将罪魁祸首追溯到System.Timers.Timer.即使这个计时器在每个Elapsed事件上调用一个空方法,它仍然无限地提高了逻辑线程数.只需将计时器更改为DispatcherTimer即可解决问题.
!dumpheap -type TimerCallback
在这个问题中提到的Windbg中运行后看到大量的数据后,我开始查看应用程序中的所有计时器.
我仍然想知道我怎么能通过Windbg调试检测到这个,而不是禁用定时器/检查性能/重复方法,这导致我修复.即任何可以告诉我哪个计时器正在创建问题的东西.
这通常是由于线程池线程卡住且未完成而导致的。每半秒,线程池管理器就会允许另一个线程开始尝试处理积压的工作。这种情况一直持续下去,直到达到 ThreadPool.SetMaxThreads() 设置的最大线程数。默认情况下,一个巨大的数字,在 4 核机器上为 1000。
使用 Debug + Windows + Threads 查看正在运行的线程。他们的调用堆栈应该清楚地表明他们阻塞的原因。
归档时间: |
|
查看次数: |
4617 次 |
最近记录: |