关于垃圾收集:调用Dispose方法将清除并压缩.Net中的内存?

Calling Dispose method will clear and compact the memory in .Net?

我对.NET中的Dispose和Finalize方法有如下想法。如果我错了,请纠正我。

Dispose:实现IDisposable Inferface并移除Dispose方法中未使用/未托管的代码。如果开发人员希望立即删除,则需要手动调用它,否则在调用资源时,GC将处理该资源。

Finalize:当调用GC时,它将释放未使用的托管代码,如果实现IDisposable,则它将调用Dispose方法释放非托管资源(通常)。

问题是:当我们使用Dispose方法处理资源时,内存将立即释放并压缩(就像GC所做的那样)?


您的问题的答案是否定的:释放为对象分配的内存与调用Dispose方法无关。当垃圾收集器到达它时,它会在适当的时候发生。

一般来说,Dispose是为了加快外部资源的释放,如文件句柄、信号量、db句柄以及操作系统经常分配的其他项。如果您的对象持有其他IDisposable对象,它也应该在调用中处理这些对象。

但是,终结器是不同的:它被称为垃圾收集的一部分,用于释放在释放期间未释放的外部资源(可能是因为用户忘记调用Dispose)。终结器不能调用对象可能包含的其他对象的Dispose,因为它们正在被垃圾收集过程中。


否。直接或通过using语句调用Dispose方法不会导致释放内存。

实现IDisposable只会给你的类一个清理它所拥有的任何非托管资源的机会。


Finalize : When GC invoked it will free the unused managed code and if IDisposable is implemented then it will call Dispose method to free up the unmanaged resources(normally).

你这里有些不正确。当您说"它将调用Dispose"时,如果您指的是GC本身,那么,不,它不会"自动"为您调用Dispose。作为程序员,在Dispose和Finalizer方法中进行清理是您的工作。

这里写的这个msdn演示了典型的处理模式。

The question is: When we dispose the resources using Dispose method, memory will be freed immediately and compacted(as GC doing)?

不,调用Dispose不会释放堆内存。在GC运行并执行清理之前,不会释放堆内存。