随着时间的推移,速度变慢可能有很多原因。从缓慢的内存泄漏到防病毒的任何地方。您能做的最好的事情是尝试构建关于首先查看应用程序的哪个区域的证据(数据)。尽量不要与许多开发人员讨论它,因为每个人都会对可能出现的问题有不同的看法。获取数据!
如何获取数据:
perfmon
perfmon 是你的朋友。您可以查看很多计数器(系统范围的以及特定于进程的)。因此,您可以从分析四大(即内存、磁盘使用情况、cpu 和网络)开始。那里有一个lot of posts 告诉你什么计数器是最好的,所以我不会在这里详细介绍性能计数器。
windbg
如果您确实看到内存正在增长并且没有被收集,那么是时候引入大炮了。 .NET 非常擅长从开发人员那里抽象出内存使用,但这意味着我们有时必须深入 .NET 以找出哪些原因不允许垃圾收集器完成其工作。 windbg 和 sos.dll(托管扩展)是一个很好的工具。 windbg 最困难的部分(以我的经验)只是正确加载 sos 扩展。您必须密切注意正在分析的目标架构(64 或 32)以及正在运行的 CLR 版本。
procdump
sysinternals 的 procdump 是一个很棒的小实用程序,可以从正在运行的进程中获取内存快照。然后,windbg 可以分析这些快照(.dmp 文件)。
sos
sos.dll 自 v2 起随 .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 流程。
对于性能问题,通常最好使用正在运行的应用程序随时间定期拍摄快照。然后您可以在分析时比较快照。
嗯,这比我预期的要长一点,但希望值得!