How to detect and avoid memory and resources

系统 1924 0
常见的内存泄露演示

作者使用了一个Forma,每一个按钮都会打开一个子form。按常理,当子form被关闭时,我们都希望它所占有的资源被自动释放。但在这里,作者将在每一个子form中演示一种泄露的情况。

How to detect and avoid memory and resources leaks in .NET applications 摘译2

Static references

最明显的,如果一个对象被静态字段(field)引用,它永远都不会被释放。这种情况常见于单键模式,因为它们往往都市静态的,要不就是长时间驻留的。
这些直接引用往往都是显而易见的,但真正危险的都是那些间接引用。因此你需要格外注意引用串。一个有效的方法就是查看这个串的根,如果这个根式静态的,那整个串上的引用都无法被释放。

How to detect and avoid memory and resources leaks in .NET applications 摘译2

如上图,如果Object1是静态的或者长驻留的,那么这条引用串上的对象都不被释放。危险的是,串很长时就很难意识到它的根是静态类型的。比如,如果仅仅注意了一级深度,那么当Object2消失的时候,Object3和Object4就应该被释放,当你很可能忽视了Object1的存在。

建议是慎用静态类型,尽可能的不用,否则请格外注意其或其他单键对象的内存驻留时间。

一种具体的风险就是静态事件,将在事件泄露演示中阐述。


事件或"lapsed listener"

子form订阅了main form的事件,以便在main form的通透度(opacity)变化时得到通知。
    mainForm.OpacityChanged += mainForm_OpacityChanged;
  

问题由此产生:OpacityChanged事件创建了一个由main form到子form的引用:
How to detect and avoid memory and resources leaks in .NET applications 摘译2
作者在另外一篇文章中讨论了 事件和引用的关系 ,这里只给出了演示图,和jetTrace截图:





How to detect and avoid memory and resources leaks in .NET applications 摘译2


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论