关于内存泄露,一般用Performance Monitor监测以下几个指标.
#1 Process/Private Bytes,
#2 .NET CLR Memory/# Bytes in All Heaps,
#3 .NET CLR LocksAndThreads/# of current logical Threads.
如果#1持续增长, 但是 #2保持平稳, 那么很可能有unmanged泄露. 如果 1和 2都持续增长,那么很可能有managed泄露. 如果#3有异常的增长, 那么泄露可能发生在线程的栈上. 在任务管理器里Process页看到的Memory一般是指working set,这个一般不用来作为内存泄露的依据。简单来说它只是表示当前程序在物理内存里面占了多少空间,和当前程序要用多少内存是两码事。
下面详细介绍使用Performance Monitor收集相关的测试数据
1. 打开Start -> Control Panel->Administrative Tools->Performance Monitor (或者直接在命令行上输perfmon, 回车)
2. 在左边找到Data Collector Sets -> User Defined,右键选择New -> Data Collect Set
3. 在弹出的对话框中填入名字,比如MySampleMemoryLeak, 下面的Radio Box 选Create Manually(advanced), 点Next
4. 选择Create data logs, 勾上Performance Counter, 点Next.
5. 点Add, 然后依次添加我们我们前面提到的三个指标。选择相关的Performance Counter,以及我们要监测的程序,点”Add>>”。三个都添加完成后点击OK。
6. 有需要的话可以调整一下抓数据的间隔时间,点Next.
7. 选择你想存放数据的路径,点Next, 点Finish.
8. 在右边的DataCollector01上面右键,选属性. 在Performance Counters页面的Log format选项下面选择”Comma Separated”(这样你就可以产生.csv文件,然后可以利用word生成直观的图表),点OK.
至此,我们所需的Performance Counter已经创建完毕。
接下来,我们可以启动要测试的程序,warm up之后就可以开始监测。在Performance Monitor里面选择刚才建的MySampleMemoryLeak,然后在工具栏上选开始(或者脚本运行命令"logman start MySampleMemoryLeak”),然后在我们的程序里面跑需要检测是否有内存泄露的scenario,跑完以后在Performance Monitor里面停止MySampleMemoryLeak的监视(或者脚本运行命令"logman stop MySampleMemoryLeak”)
最后,我们可以打开csv文件,根据里面的数据生成图表,根据其增长趋势,判断有没有内存泄露以及是哪一类型的泄露。