在 Visual Basic .NET 中,垃圾收集(Garbage Collection,GC)是一种自动内存管理过程,用于释放未使用的对象,以防止内存泄漏。当创建对象时,内存在受控堆上分配,当对象不再有引用时,垃圾收集器会随着时间的推移释放所占用的资源。
特点:
Finalize 方法来清理非托管资源,但更可靠的是使用 IDisposable 接口和 Dispose 方法。Using 结构以自动调用 Dispose 方法。使用 Dispose 的代码示例:
Public Class FileManager Implements IDisposable Private disposed As Boolean = False ' ... 非托管资源 Public Sub Dispose() Implements IDisposable.Dispose If Not disposed Then ' 清理资源 disposed = True End If GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose() MyBase.Finalize() End Sub End Class
能否确信程序结束时会调用对象的终结器?
错误答案: 是的,终结器会在对象不再需要时自动调用。
正确答案: 否,进程结束时并不能保证会调用终结器。终结器只有在 GC 有时间处理它们的情况下才会被调用。要可靠地释放资源,始终使用 Dispose。
示例:
' 使用 Using 结构以确保资源的释放 Using mgr As New FileManager() ' 处理资源 End Using
故事
在一个文件处理项目中,临时文件没有被删除,因为仅依赖于终结器。在大量文件情况下 — 文件系统溢出,直到实施了显式调用Dispose。
故事
开发人员在每次操作后手动调用GC.Collect()— 这大大降低了应用程序的性能,因为频繁的垃圾收集消耗了大量 CPU。
故事
在大型 web 应用程序中,某个服务错误地实现了 Dispose 模式,并未调用GC.SuppressFinalize()。这导致对象被双重清理,造成了意外崩溃和资源泄漏。