Eng*_*ock 2 .net c# memory memory-leaks appdomain
有一个由三个可执行文件组成的应用程序.其中之一 - 调度程序,运行其他可执行文件.调度程序在完成时从可执行文件接收代码.也就是说,只有调度程序始终在运行,其他可执行文件会卸载并再次加载.该应用程序在服务点运行并全天候工作.在第一次启动时,应用程序运行得很快.在一天结束时,应用程序运行速度非常慢.这种行为可能是什么原因?
随着时间的推移,可能有很多原因导致减速.从缓慢的内存泄漏到反病毒的任何地方.您可以做的最好的事情是尝试建立关于首先要查看的应用程序区域的证据(数据).尽量不与许多开发者交谈,因为每个人都会对可能出错的地方有不同的看法.获取数据!
如何获取数据:
perfmon perfmon是你的朋友.您可以查看许多计数器(系统范围以及特定于流程).所以你可以从分析大4(那是内存,磁盘使用,cpu和网络)开始.这里有很多帖子在那里什么专柜是最好的,所以我不会进入对这里的Perf Counters的太多细节.
windbg 如果你确实看到记忆力正在增长而没有被收集,那么就该引进大枪了..NET非常适合从开发人员那里抽象内存使用,但这意味着我们必须在.NET下面找到不允许垃圾收集器完成其工作的内容. 带有 sos.dll(托管扩展)的 windbg是一个很棒的工具.windbg中最困难的部分(根据我的经验)只是正确加载了sos扩展.您必须密切关注要分析的目标体系结构(64或32)以及正在运行的CLR版本.
sysinternals的 procdump procdump是一个很好的小工具,用于从正在运行的进程中获取内存快照.然后可以通过windbg分析这些快照(.dmp文件).
sos 自v2以来,sos.dll随.NET Framework一起提供.使用v4,Visual Studio 2010集成了sos并允许您分析.dmp文件!
我发现最有用的内存泄漏的sos命令是:
!eeheap -gc (每个堆的每一代中的内容概述)
!dumpheap -min<size> (转出特定的所有对象和类型<size>)
!dumpheap -type<type> (转出特定的所有对象<type>)
!gcroot<address> (打印出一个堆栈,这样你就可以看到GC中的父对象固定了什么)
!do<address> (打印出特定对象的内存)
其他一些指示:
通常,您希望在负载下快照内存,因此最好有一些方法来模拟系统外部的内存.因此,最好提前运行,甚至将其用于应用程序的QA流程.
对于性能问题,通常最好使用正在运行的应用程序随时间拍摄常规快照.然后,您可以在分析时比较快照.
嗯,这比我想要的要长一点,但希望值得!
| 归档时间: |
|
| 查看次数: |
3116 次 |
| 最近记录: |