编程VB.NET 开发人员

在 Visual Basic .NET 中,什么是垃圾收集(Garbage Collection),对象的终结是如何工作的,以及在内存管理中需要注意什么?

用 Hintsage AI 助手通过面试

答案

在 Visual Basic .NET 中,垃圾收集(Garbage Collection,GC)是一种自动内存管理过程,用于释放未使用的对象,以防止内存泄漏。当创建对象时,内存在受控堆上分配,当对象不再有引用时,垃圾收集器会随着时间的推移释放所占用的资源。

特点:

  • 通常不建议手动调用 GC,而是信任 .NET 环境的控制。
  • 类可以实现 Finalize 方法来清理非托管资源,但更可靠的是使用 IDisposable 接口和 Dispose 方法。
  • 使用 Using 结构以自动调用 Dispose 方法。
  • 终结器不会在失去引用后立即执行,而是在 GC 认为合适的时候进行。

使用 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()。这导致对象被双重清理,造成了意外崩溃和资源泄漏。