【IT168 技术文档】
在.NET Framework中,内存管理应该由系统自动管理。这使得用户能够将精力集中在应用设计与研发等重要事情上。但是,由于基于.NET的应用内存问题频现,使得自动管理的内存成为了还未实现的乌托邦。本文将研究一款名为CLR Profiler的工具 (Common Language Runtime) 可用来追踪内存问题。
垃圾收集器
.NET平台采用了Java中使用的垃圾收集器方法。也就是说,.NET系统跟踪所有应用中所分配的内存块。通过它可以了解内存何时被分配,及其所占用的监视器。系统还可以了解内存何时被耗尽以及何时被释放。垃圾收集器能够完成这些任务,但是无法把你彻底从理解内存分配的问题中解脱出来。
.NET中的对象是从一个被称为托管堆(managed heap)的内存区中分配而来。这个堆只所以被称为托管堆是因为在申请内存以后,垃圾收集器将负责这个堆的清理事务。
垃圾收集器首先假设所有缺少证据的对象都没有保留的必要。对象需要提供参考来证明自身存在的必要,或者证明自己正为其他某个对象提供参考。如果对象需要保留,就不会进入垃圾收集器的工作循环。从另一方面来说,如果目标不需要保留,则目标就被标记为可丢弃。
尽管垃圾收集器的进程完全自动,你还是应该知道内存在应用中是如何使用的。这使你能够确认内存在应用中的使用是否适当,以及垃圾收集器是如何工作的。这会涉及到通过对象寿命以了解垃圾收集器的工作频率来判断垃圾收集器工作是否负担过重。
代码解析器(Code profiler)能够揭示应用的底层工作状态,让您更好的了解内存的使用。.NET CLR包括一个API解析工具,可用来为托管应用编写自定义的解析器。市场上有很多商业解析工具,但是微软公司提供一款免费软件,名为CLR Profiler。
CLR Profiler
您所下载到的软件是一个单独的安装程序,能够将工具安装到系统上。另外,还带有大量文档。CLR Profiler让您能够查看.NET应用的底层,了解其运行情况,还能监控垃圾收集堆。通过安装CLR Profiler,您能够了解到应用的以下信息:
·某种类型的对象以何种方式进行分配?
·那些对象得以保留?
·垃圾收集堆由什么组成?
·什么使对象保持活跃?
·哪个对象呼叫了垃圾收集器,以及呼叫频率?
·哪个对象进行了什么类型、级别和模块的呼叫?
CLR
Profiler所使用的数据储存在独立的日志文件中。应用拥有Windows客户端和命令语句两种界面。
由于这款工具会生成日志文件,因此的确会影响应用性能,因此在生产环境中要谨慎使用。另外,由于日志记载内容的不同,日志文件的大小也许会非常庞大,因此要注意硬盘空间。最后,CLR Profiler会启动它将要解析的应用,因此你不能在正在运行中的程序中使用CLR Profiler。
通过Windows客户端界面运行应用非常简单。通过这个简单的界面就可以启动和停止解析,以及查看托管堆上当前的内容。另外,您还可以通过选择框启动和停止解析(如果您只是在某个操作过程中进行解析的话,这会是个不错的选择)。
当解析结束以后会生成日志文件。您可以获得图形报告了解被解析的应用的内存使用情况。这些图形报告使你能够追踪对象的创建,对象消耗的内存,托管堆大小,所创建的对象的类型等等。这些结论都通过图形反映出来,因此数据非常容易被眼睛接受(这和浏览日志文件完全不同)。
商用工具
如果你发现CLR Profiler无法满足您对解析的需求,你还可以选用市场上的一些第三方产品。以下为其中一些产品的列表。
ANTS Profiler: 可以对桌面和网络应用提供解析,最新的版本据说可以支持Windows Vista。
DevPartner 性能分析软件: 能够支持.NET,也能支持过去的COM, COM+和ASP技术。
NProf: 免费的开源解析器。它和其他开源软件一样,文档比较有限。