如何检测Memory Leak?
Summary
Memory Leak,这个东东可是一个非常讨厌的,通俗的讲,就是一个应用程序不断的申请内存空间,而它从来不会去释放,或者说,一个应用程序申请完内存之后它不会告诉操作系统"我用完了,你可以分配给其他人用了",而随着时间的增长,系统的可用内存量会越来越低,最后导致应用程序的崩溃,或者操作系统非常缓慢的性能,甚至崩溃。
比如,一个用户,他的使用习惯中从来就没有关机的概念,那么他的PC就一直处于运行状态,可能一周之后,他会发现自己的PC运算速度非常缓慢,自己的硬盘经常狂转,这可能往往就代表会有某个应用程序或者是Windows的某个东东存在Memory Leak。(所以说,没事多关机,不仅省电,而且还可解决Memory Leak),但对于Server来讲,他们几乎不存在关机的可能,所以如果有一个应用程序存在Memory Leak,那么Server就会产生一段时间一死机的现象,所以Memory Leak对Server来讲可可以说是致命的,对微软来说,如果发现一个应用程序存在Memory Leak,那么这是属于比较大的Issue,而如果是在Server Platform上面,甚至会影响产品的Release。所以,很多时候,微软的产品没有如期的发布,往往是因为产品在最后一系列的测试环节中没有通过,我觉得广大的用户应该多多理解微软的产品延期。
通常来说
C++应用程序中的Memory Leak现象常见,因为这种语言没有垃圾收集机制,那么.NET 应用程序呢?如果你相信了宣传的不会存在Memory Leak,那么你就不是一个好的Tester,因为Tester的一个大忌就是trust,而Dev(软件开发者)们说的话,那更是从来不要相信的,
,还好漂亮的XXX姐姐不懂中文...
More Information
其实,从经验上来说,检测Memory Leak,比较有效的是两个关键的性能计数器(Performance Counter),他们是:
Process\Private Bytes
Proccess\Virtual Bytes
比如,你想看一下你写的应用程序是否存在Memory Leak,那么你需要:
1.不断的进行各项符合你应用程序的End User experience 的操作,如果你的应用程序Support多用户,那么更要考虑这个特点,总之,不停的模拟最终用户可能进行的操作。(还好,微软的前辈们已经写出来了很完善的Automation Test Framework,可以不用自己Click菜单了
)
2.监测你的Application的各项Performance Counter,比如你的App叫做TestApp.exe,那么在Windows的
Performanc Logs and Alerts\Counter Logs\Add Counters, 选择Process,然后选中你的TestApp.exe(这个时候需要你的TestApp.exe已经启动了)
3.测试足够长的时间,观察TestApp.exe的Private Bytes和Virtual Bytes,以及系统的Memroy\Availabe Bytes的曲线变化。
如果,Private Bytes成一个固定夹角增加,那么这个应用程序就可能存在Memory Leak了,当然这个时候Virtual Bytes也会增加,而系统的Memory\Available Bytes就会降低,这里只能说一种趋势,而无法给出具体的数据和图表,因为测试的环境、方法以及诸多的因素都不是相同的,所以无法作横向对比,你需要不断的进行自己应用程序的基础数据的测量,而微软的在这方面作的努力,常常是让我很惊叹的。
《世界是平的》,这本书说世界各地的人才是没有国界的,而现在我突然发现,原来很多学科之间也没有边界的,现在在作基础数据测量的实验方法,竟然和我大学时作的化学实验是如此的相似。