欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

UU'S T&T

TIPS AND TROUBLESHOOTS FOR WINDOWS

公告

  • 本Blog站点上的任何言论仅代表个人观点,与其所在的公司没有任何关系。本Blog站点的内容是按原样提供的,作者与其公司并不对其提供任何种类的担保。此外还否认所有暗示的保证,包括但不局限于在任何试销性或某一特定用途的适用性方面的暗示保证。由于本站内容的使用或性能表现带来的全部风险将由使用者自己承担。任何由于使用或无法使用本站内容而带来的损失(包括但不局限于商业利润、业务中断、业务信息或其他财产上的损失),即使在 本站作者曾经被提醒可能出现这些损失的情况下,本站 及其作者或涉及内容创建的任何其他人等对任何上述的损失概不负责。
    ·本BLOG的内容均属技术交流之用,本人对所发表的文章、图片、随笔保留一切权利。
    如文章、图片、随笔转载请注明:
    作者姓名:尤扬
    文章来源URL:
    http://blogs.itecn.net/blogs/youyang
    同时请通过EMAIL通知本人:
    youyang1983◎hotmail.com
    ·如果通过EMAIL与我联系,并最终解决的问题,我将发表于本BLOG进行技术分享,如果涉及隐私或有特殊要求请于EMAIL中说明!
    本人联系方式:
    MSN ID:youyang1983◎hotmail.com(常用)
    QQ ID:85836514
    EMAIL:v-yayou@microsoft.com
    ·技术就是无条件共享


    2005年7月 Microsoft MVP for Windows-Shell\User
    2006年7月 Microsoft MVP for Windows-Shell\User
    2007年7月 Microsoft MVP for Windows-Shell\User

Microsoft

朋友的网站

如何检测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(软件开发者)们说的话,那更是从来不要相信的,Stick out tongue,还好漂亮的XXX姐姐不懂中文...

More Information

其实,从经验上来说,检测Memory Leak,比较有效的是两个关键的性能计数器(Performance Counter),他们是:

Process\Private Bytes

Proccess\Virtual Bytes

比如,你想看一下你写的应用程序是否存在Memory Leak,那么你需要:

1.不断的进行各项符合你应用程序的End User experience 的操作,如果你的应用程序Support多用户,那么更要考虑这个特点,总之,不停的模拟最终用户可能进行的操作。(还好,微软的前辈们已经写出来了很完善的Automation Test Framework,可以不用自己Click菜单了Big Smile)

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就会降低,这里只能说一种趋势,而无法给出具体的数据和图表,因为测试的环境、方法以及诸多的因素都不是相同的,所以无法作横向对比,你需要不断的进行自己应用程序的基础数据的测量,而微软的在这方面作的努力,常常是让我很惊叹的。

《世界是平的》,这本书说世界各地的人才是没有国界的,而现在我突然发现,原来很多学科之间也没有边界的,现在在作基础数据测量的实验方法,竟然和我大学时作的化学实验是如此的相似。

 

 

Posted: 2007年4月27日 13:22 作者 youyang

评论

ahpeng 说:

Cool!

很棒的文章。

有点小小的失误,没有强调“内存泄漏”实际上对“可用物理内存”影响不大,主要影响的是虚拟内存。

我翻译的Mark Russinovich的文章里提到:

如果进程申请了内存,但是由于Bug而无法释放(内存泄漏)。 哪怕产生内存泄漏的进程无法退出,内存管理器的工作集调整机制也会最终从进程的工作集中“盗取”所有的物理页(分配给泄漏的虚拟内存)。该进程会把泄漏的虚拟页发送到页面文件,这样系统就可以腾出物理内存挪作它用。所以对可用物理内存来说,内存泄漏只有有限的影响。真正的影响在于虚拟内存的消耗,在任务管理器中叫做“PF使用率”和“提交更改”。

http://blogs.itecn.net/blogs/ahpeng/archive/2007/04/13/WinMemMgmt.aspx

# 四月 27, 2007 14:59

youyang 说:

To PP

嗯,没错,但是,Memroy Leak一项最直接的后果就是让Windows频凡的“该进程会把泄漏的虚拟页发送到页面文件,这样系统就可以腾出物理内存挪作它用”。而这就是导致硬盘狂转的原因,而对于最终用户来说,他们的感觉就是系统非常非常缓慢,而至于到底是Physical Memory 还是Virtual Memory其实对用户来说都不会有太大的区别,尤其是Windows TaskManger 里面的Memroy Usage项根本不能和系统性能挂钩。

# 四月 27, 2007 15:22

Godspeed 说:

嗯嗯, 同意的说。

我现在做一些小硬件的性能测试, 也是用大一时候的方法....

对了, 谢谢!

# 四月 27, 2007 22:22

盆盆 说:

UU从化学跨越到MS,虽然都是做Test方面的事情,但是这个跨度也实在是太大了,一定要PF一下!

# 四月 28, 2007 9:00

SFreeDom 说:

有个bug,文章很多地方将Memory写成了Memroy!

# 五月 10, 2007 22:57

youyang 说:

TO: SFreeDon

Great!!

嗯,BUG重现,修复中!

# 五月 17, 2007 23:14
禁止匿名发表评论