在一个进程中,可以调用几个方法来监视垃圾回收器。具体的说,GC类提供了以下静态方法,可调用他们查看某一代发生了多少次垃圾回收,或者托管堆中的对象当前使用了多少内存。
public static long GetTotalMemory(bool forceFullCollection);
public static int CollectionCount(int generation);
为了评估一个特定的代码块的性能,我经常在这个代码块的前后写代码调用这些方法,并计算差异。这使我能很好的把握代码块对进程工作集的影响,并了解执行代码块时发生了多少次垃圾回收。如果这个数字太高,我就知道应该花更多的时间调整代码块中的算法了。
还可以了解单独的AppDomain使用了多少内存。
安装.NET Framework时,它会安装一组性能计数器,为CLR的操作提供大量实时统计数据。这些统计数据可以通过Window自带的PerfMon.exe工具或者“系统监视器”ActiveX控件来查看。为了访问“系统监视器”,最简单的方法时运行PerfMon.exe,单击+工具栏按钮,随后显示添加计数器对话框。
为了监视CLR的垃圾回收器,请选择”.NET clr memory”性能对象,然后再下方的实例列表中选择一个具体的应用程序。最后,选定向监视的计数器集合,单击”添加”,再“确定”,随后,“性能计数器”会显示实时统计数据。要想知道一个特定计数器的含义,选定计数器,然后勾选”显示描述”来获得该计数器的详细说明。
还有一个很出色的工具可监视应用程序的对象分配,它的名字是CLR Profiler。该工具提供了调用评估、堆快照以及内存使用时间线等功能。另外,该工具还提供了API,可在测试代码中利用这个API开始和停止评估,并在日志中插入注释。另外,该工具还提供了源代码,可根据自己的需要修改它。
最后,还可以研究一下SOS Debugging Extension(sos.dll)。调试内存问题或其他CLR问题时,它经常能提供出色的协助。对于内存有关的运行,SOS Debugging Extension 允许检查进程中为托管堆分配了多少内存,显示在终结队列中登记终结的所有对象,显示每个AppDomain或整个进程的GCHandle表中的记录项,并显示是什么根保持对象在堆中存活。