NET内存泄露.doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:3 大小:35KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

NET内存泄露.doc

NET内存泄露.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Net内存泄露目录HYPERLINK"http://baike.baidu.com/view/3539539.htm"\l"1"HYPERLINK"http://baike.baidu.com/view/3539539.htm"\l"2"HYPERLINK"http://baike.baidu.com/view/3539539.htm"\l"3"HYPERLINK"http://baike.baidu.com/view/3539539.htm"\l"4"HYPERLINK"http://baike.baidu.com/view/3539539.htm"\l"1"1.什么是.Net内存泄露HYPERLINK"http://baike.baidu.com/view/3539539.htm"\l"2"2..Net内存泄露的检测HYPERLINK"http://baike.baidu.com/view/3539539.htm"\l"3"3.内存泄露诊断工具HYPERLINK"http://baike.baidu.com/view/3539539.htm"\l"4"4.如何开发出更健壮的程序展开HYPERLINK"http://baike.baidu.com/view/3539539.htm"编辑本段1.什么是.Net内存泄露可能很多HYPERLINK"http://baike.baidu.com/view/4294.htm"\t"_blank".Net的用户(甚至包括一些dotNet开发者)对Net的内存泄露不是很了解,甚至会说.Net不存在内存泄露,因为“不是有GC机制吗?----”恩,是有这么回事,它可以让你在通常应用中不用考虑令人头疼的资源释放问题,但很遗憾的是这个机制不保证你开发的程序就不存在内存泄露。甚至可以说,dotNet中内存泄露是很常见的。这是因为:一方面,GC机制本身的缺陷造成的;另一方面,Net中HYPERLINK"http://baike.baidu.com/view/3740372.htm"\t"_blank"托管资源和HYPERLINK"http://baike.baidu.com/view/3740325.htm"\t"_blank"非托管资源的处理是有差异的,托管资源的处理是由GC自动执行的(执行时机是不可预知的),而非托管资源(占少部分,比如文件操作,网络连接等)必须显式地释放,否则就可能造成泄露。综合起来说的话,由于托管资源在Net中占大多数,通常不做显式的资源释放是可以的,不会造成明显的资源泄露,而非托管资源则不然,是发生问题的主战场,是最需要注意的地方。另外,很多情况下,衰老测试主要关注的是有没有内存泄露的发生,而对其他泄露的重视次之。这是因为,内存跟其他资源是正相关的,也就是说没有内存泄露的发生,其他泄露的发生概率也较小,其根本原因在于几乎所有的资源最后都会在内存上有所反应。HYPERLINK"http://baike.baidu.com/view/3539539.htm"编辑本段2..Net内存泄露的检测有没有内存泄露的发生?判断依据是那些?如果程序报“Outofmemory”之类的错误,事实上也占据了很大部分的内存,应该说是典型的内存泄露,这种情况属于彻底的Bug,解决之道就是找到问题点,改正。但我的经验中,这种三下两下的就明显的泄露的情况较少,除非有人在很困的情况下编码,否则大多是隐性或渐进式地泄露,这种需经过较长时间的衰老测试才能发现,或者在特定条件下才出现,对这种情况要确定问题比较费劲,有一些工具(详见1.3)可以利用,但我总感觉效果一般,也可能是我不会使用吧,我想大型程序估计得无可奈何的用这个,详细的参见相关手册。需要强调的是,判断一个程序是不是出现了"memoryleak",关键不是看它占用的内存有多大,而是放在一个足够长的时期(程序进入稳定运行状态后)内,看内存是不是还是一直往上涨,因此,刚开始的涨动或者前期的涨动不能做为泄露的充分证据。以上是些比较感性的说法,实际操作中是通过一些性能计数器来测定的。大多数时候,主要关注Process里的以下几个指标就能得出结论,如果这些量整体来看是持续上升的,基本可以判断是有泄露情况存在的。A.HandleCountB.ThreadCountC.PrivateBytesD.VirtualBytesE.WorkingSetF.另外.NETCLRMemory下的Bytesinallheeps也是我比较关注的。通过观察,如果发现这些参数是在一个区间内震荡的,应该是没有大的问题,但如果是一个持续上涨的状态,那就得注意,很可能存在