应该了解的垃圾收集机制(二)
2008-03-21 11:05
337 查看
对于大多数应用而言,了解垃圾收集机制的主要动机并不是为了对内存“省吃俭用”,而是为了处理非托管资源的控制问题,这些问题往往跟内存的大小没有什么关系。例如对一个文件进行操作,该何时关闭文件,关闭文件时要注意什么问题,如果忘了关闭会带来什么后果?这些都是我们需要认真考虑的,无论你的内存有多大:)
对于这一类的操作,我们不能依赖GC帮我们做,因为它并不知道我们在释放时想干什么,它甚至不知道自己该干什么!我们不得不自己动手来编写处理代码。当然,微软已经为我们搭好了框架,就是这两个函数:Finalize和Dispose。它们也代表了非托管清理的两种方式:自动和手动。
一. Finalize
Finalize很像C++的析构函数,我们在代码中的实现形式为
class DisposePattern :IDisposable
class DerivedClass : DisposePattern
{
protected override void Dispose(bool disposing)
{
lock (this)
{
try
{
//清理自己的非托管资源,
//实现模式与DisposePattern相同
}
finally
{
base.Dispose(disposing);
}
}
}
}
当然,如果DerivedClass本身没有什么资源需要清理,那么就不需要重写Dispose方法了,正如我们平时做的一些对话框,虽然都是继承于System.Windows.Forms.Form,但我们常常不需要去重写基类Form的Dispose方法,因为本身没有什么非托管的咚咚需要释放。
了解GC的脾性在很多时候是非常必要的,起码在出现资源泄漏问题的时候你不至于手足无措。我写过一个生成excel报表的控件,其中对excel对象的释放就让我忙活了一阵。如果你做过excel开发的话,可能也遇到过结束excel进程之类的问题,特别是包装成一个供别人调用的库时,何时释放excel对象以确保进程结束是一个关键问题。当然,GC的内部机制非常复杂,还有许多内容可挖,但了解所有细节的成本太高,只需了解基础,够用就好。
对于这一类的操作,我们不能依赖GC帮我们做,因为它并不知道我们在释放时想干什么,它甚至不知道自己该干什么!我们不得不自己动手来编写处理代码。当然,微软已经为我们搭好了框架,就是这两个函数:Finalize和Dispose。它们也代表了非托管清理的两种方式:自动和手动。
一. Finalize
Finalize很像C++的析构函数,我们在代码中的实现形式为
class DisposePattern :IDisposable
class DerivedClass : DisposePattern
{
protected override void Dispose(bool disposing)
{
lock (this)
{
try
{
//清理自己的非托管资源,
//实现模式与DisposePattern相同
}
finally
{
base.Dispose(disposing);
}
}
}
}
当然,如果DerivedClass本身没有什么资源需要清理,那么就不需要重写Dispose方法了,正如我们平时做的一些对话框,虽然都是继承于System.Windows.Forms.Form,但我们常常不需要去重写基类Form的Dispose方法,因为本身没有什么非托管的咚咚需要释放。
了解GC的脾性在很多时候是非常必要的,起码在出现资源泄漏问题的时候你不至于手足无措。我写过一个生成excel报表的控件,其中对excel对象的释放就让我忙活了一阵。如果你做过excel开发的话,可能也遇到过结束excel进程之类的问题,特别是包装成一个供别人调用的库时,何时释放excel对象以确保进程结束是一个关键问题。当然,GC的内部机制非常复杂,还有许多内容可挖,但了解所有细节的成本太高,只需了解基础,够用就好。
相关文章推荐
- 应该了解的垃圾收集机制
- 应该了解的垃圾收集机制(二)
- 应该了解的垃圾收集机制(一)
- 应该了解的垃圾收集机制(一)
- .Net垃圾收集机制 了解算法与代龄
- 了解的垃圾收集机制(转一)
- .Net垃圾收集机制—了解算法与代龄
- 一篇文章彻底了解Java垃圾收集(GC)机制
- 了解DOM:Javascript执行环境和垃圾收集
- JAVA垃圾收集机制剖析
- 垃圾收集机制(Garbage Collection)批判
- JDK6.0学习笔记(二)垃圾收集机制-对象引用的类型
- JAVA垃圾收集机制剖析
- javascript垃圾收集机制与内存泄漏详细解析
- 5-Dalvik垃圾收集机制Cocurrent GC
- 【摘录】JAVA内存管理-JVM垃圾收集机制
- JVM垃圾回收机制总结(3) :按代垃圾收集器
- 了解垃圾收集器与内存分配策略的前奏
- 【深入Java虚拟机】之八:Java垃圾收集机制
- 链表的应用——垃圾收集机制&动态分配内存的工作原理