调用Dispose方法将清除并压缩.Net中的内存?
我有关于.Net中的Dispose和Finalize方法的想法如下。 如果我错了,请纠正我。
Dispose:在Dispose方法中实现IDisposable接口并删除未使用/非托管的代码。 如果需要立即移除,开发人员需要手动调用它,否则GC将在调用资源时处理资源。
Finalize:GC调用时会释放未使用的托管代码,如果实现了IDisposable,它将调用Dispose方法释放非托管资源(通常)。
问题是:当我们使用Dispose方法处理资源时,内存将被立即释放并被压缩(如GC所做的那样)?
你的问题的答案是否定的:释放为对象分配的内存与调用Dispose
方法无关。 它发生在适当的时候垃圾收集器到达它。
一般来说, Dispose
旨在加快释放外部资源,例如文件句柄,信号量,数据库句柄以及操作系统经常分配的其他项目。 如果您的对象持有其他IDisposable
对象,则它应该将它们置于其调用中以处置。
然而,Finalizer是不同的:它被称为垃圾收集的一部分,用于释放在处理过程中尚未释放的外部资源(可能是因为用户忘记调用Dispose
)。 终结器不得调用Dispose
对象可能拥有的其他对象,因为它们正在进行垃圾回收。
不可以。直接调用Dispose方法或通过using语句调用不会导致内存被释放。
实现IDisposable只会让你的班级有机会清理它所持有的任何非托管资源。
Finalize:GC调用时会释放未使用的托管代码,如果实现了IDisposable,它将调用Dispose方法释放非托管资源(通常)。
你在这里有些不正确。 当你说“它会调用Dispose”时,如果你指的是GC本身,那么,不,它不会“自动”调用Dispose给你。 这是您作为程序员在Dispose和Finalizer方法中进行清理的工作。
这里的MSDN写法演示了典型的处理模式。
问题是:当我们使用Dispose方法处理资源时,内存将被立即释放并被压缩(如GC所做的那样)?
不,调用Dispose不会释放堆内存。 在GC运行并执行清理之前,堆内存不会被释放。
链接地址: http://www.djcxy.com/p/9237.html上一篇: Calling Dispose method will clear and compact the memory in .Net?