如何有效识别和应对.NET资源泄露问题及处理方案?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1296个文字,预计阅读时间需要6分钟。
.NET自然拥有强大的易用垃圾回收机制,但这并不意味着你可以对资源管理放任不管。实际上,在不注意的情况下,可能就造成了资源泄露,甚至导致系统崩溃。那时再排查问题就晚了。
.NET虽然拥有强大易用的垃圾回收机制,但并不是因为这样,你就可以对资源管理放任不管,其实在稍不注意的时候,可能就造成了资源泄露,甚至因此导致系统崩溃,到那时再来排查问题就已经是困难重重。
一、知识点简单介绍
常见的资源泄露有:
- 内存泄漏:非托管资源没有释放、非静态对象注册了静态实例。
- GDI泄露:字体。
- 句柄泄露:Socket或线程。
- 用户对象泄露:移除的对象未释放。
二、具体实例
1. 内存泄漏
很常见的现象是分不清哪些对象需要释放,对于控件、Stream等一些非托管资源也只管新增,却没有释放,功能是实现了,却埋了颗不小的雷。
private void button1_Click(object sender, EventArgs e) { for(int i=0;i<1000;i++) this.Controls.Add(new TabPage()); }
private void button1_Click(object sender, EventArgs e) { new Form2.ShowDialog(); }
如果你觉得写这样的代码很Cool,很简洁,你在项目中也有这么写代码,那你就碰到大麻烦了,你试试在上面Form2中开个大一点的数组来检查内存,然后运行,按几下按钮,你就会发现,内存一直增加,即使你调用了GC也无济于事。
本文共计1296个文字,预计阅读时间需要6分钟。
.NET自然拥有强大的易用垃圾回收机制,但这并不意味着你可以对资源管理放任不管。实际上,在不注意的情况下,可能就造成了资源泄露,甚至导致系统崩溃。那时再排查问题就晚了。
.NET虽然拥有强大易用的垃圾回收机制,但并不是因为这样,你就可以对资源管理放任不管,其实在稍不注意的时候,可能就造成了资源泄露,甚至因此导致系统崩溃,到那时再来排查问题就已经是困难重重。
一、知识点简单介绍
常见的资源泄露有:
- 内存泄漏:非托管资源没有释放、非静态对象注册了静态实例。
- GDI泄露:字体。
- 句柄泄露:Socket或线程。
- 用户对象泄露:移除的对象未释放。
二、具体实例
1. 内存泄漏
很常见的现象是分不清哪些对象需要释放,对于控件、Stream等一些非托管资源也只管新增,却没有释放,功能是实现了,却埋了颗不小的雷。
private void button1_Click(object sender, EventArgs e) { for(int i=0;i<1000;i++) this.Controls.Add(new TabPage()); }
private void button1_Click(object sender, EventArgs e) { new Form2.ShowDialog(); }
如果你觉得写这样的代码很Cool,很简洁,你在项目中也有这么写代码,那你就碰到大麻烦了,你试试在上面Form2中开个大一点的数组来检查内存,然后运行,按几下按钮,你就会发现,内存一直增加,即使你调用了GC也无济于事。

