用CLR分析器监视.NET程序性能
垃圾回收
.NET平台采用的是在Java中使用的垃圾回收方式。这也就是说,.NET系统会追踪分配给应用程序的所有内存块。它知道什么时候分配内存以及什么在监视它的使用状况。系统还知道什么时候它不再被使用并将其释放。垃圾回收会处理这些任务,但是它不能完全让你放心地不去了解内存的分配情况。
.NET里的对象的分配来自一个叫做可管理堆的内存区域。这个堆被当作是可管理的,因为在你向它请求获取内存之后,垃圾回收器会处理清除任务。
垃圾回收在一开始会假设所有的对象都是不需要的,除非另外能够证明需要使用它们。对象要通过其参考或者参考它的东西来证明它是肯定必要的。如果对象是必要,那么它就不进入垃圾回收的循环。而另外一方面,如果某个对象不再需要了,它就会打上可以被清除的标记。
虽然垃圾回收是一个自动的过程,但是你应该清楚地知道内存是如何在一个应用程序里被使用的。这就让你需要确定应用程序是否在正确地使用分配给它的内存,以及垃圾回收器是如何被使用的。这要求你了解用来确定多久调用一次垃圾回收的对象的生命周期,以便你能确定垃圾回收器是否承担过重的任务。
代码分析器能够通过察看应用程序的内部工作状况来帮助实现这一过程,这就让你能够对内存的使用状况有一个更好的了解。.NET的CLR包括一个分析API,你可以用它来自己编写针对可管理应用程序的分析器。市面上有很多商业分析器,但是微软提供了一个叫做CLR分析器(CLR Profiler)的免费程序。
CLR分析器
这个下载的文件里有一个安装程序,它会把工具放到你的系统里。此外,里面还有大量的文档。CLR分析器能够让你对.NET应用程序(的运行状况)有一个大概的了解,并告诉你它运行的时候会发生什么事情。它会让你监视在垃圾回收堆工作的时候正在发生什么事情。通过安装CLR分析器,你可以获得关于应用程序的下列信息:
哪种方法在分配哪种类型的对象?
哪些对象被保留下来?
堆里有什么?
是什么让对象存活下来?
谁多久调用谁一次?
哪些方法、类,以及模块被谁捕获了?
CLR分析器所使用的这些数据被保存在一个独立的日志文件里。这个应用程序同时提供Windows客户端和命令行界面。
这个工具确实影响到了应用程序的性能,因为它生成了日志数据,所以如果要把它用在一个生产环境里你就要小心了。此外,日志数据文件的大小可能会根据它所记录的对象而变得非常巨大,所以要注意硬盘空间的大小。最后,CLR分析器会启动被它分析的应用程序,因此你无法将它用在当前正在运行的进程上。
通过Windows客户端界面运行这个分析器很简单。这个简单的界面允许其开始和停止分析,以及察看堆里的当前内容。此外,你可以通过复选框开始和停止分析(如果你只需要对某些操作进行分析时,这是一个非常好的选择)。
分析一停止就会生成一个日志文件。你可以查看叫做视图的各种图表/报告,以便了解被分析的应用程序的内存使用状况。这些视图让你能够追踪对象的创建、对象所消耗的内存、堆的大小、被创建的对象的类型以及其他等等。这些都可以通过图标来查看,所以这些数据很容易看懂(这与查看一堆日志文件完全不同)。
商业工具
如果你觉得CLR分析器还不能够满足你的分析要求,那么市面上有各种第三方的工具供你选择。下面就列出了其中的一些产品。
ANTS分析器:它允许你同时分析桌面和Web应用程序,最新的版本还承诺支持Windows Vista。
DevPartner性能分析器:它提供了对.NET和以前技术的支持,比如COM、COM+和ASP。
NProf:一个免费的开放源代码分析器,但是就和很多开放源代码项目一样,它提供的文档有限。
Tony Patton的职业生涯开始于应用程序开发员,并已经获得了代表其专业水平的Java、VB、Lotus和XML认证。