垃圾收集入门

垃圾收集(GC)是一种自动回收由程序不再需要的对象占用的内存的方法。这与手动内存管理形成对比,其中程序员明确指定应该释放哪些对象并将其返回到内存。好的 GC 策略比手动内存管理更有效,但它可能取决于软件的类型。

垃圾收集的主要优点是:

  • 它使程序员不必进行手动内存管理。
  • 它避免了手动内存管理可能产生的某些难以发现的错误(例如悬空指针,双重释放,某些类型的内存泄漏)。
  • 使用垃圾收集的语言通常不那么复杂。

主要缺点是:

  • 与手动内存管理相比,垃圾收集有一些开销。
  • 它可能会影响性能,尤其是在不需要的时刻触发垃圾收集时。
  • 它是不确定的,程序员不知道何时完成垃圾收集以及是否释放了对象。

大多数较新的编程语言都内置了垃圾收集,例如 Java,C#,.NET,Ruby 和 JavaScript。像 C 和 C++这样的旧语言没有垃圾收集,尽管有垃圾收集可用的实现。还有一些语言允许你使用垃圾收集和手动内存管理的组合,例如 Modula-3 和 Ada。

垃圾收集策略不同,但许多人使用标记和扫描方法的(变体)。在标记阶段,找到并标记所有可访问的对象。在扫描阶段,扫描堆以查找无法访问和未标记的对象,然后清除这些对象。现代垃圾收集器还使用分代方法,其中保留两个或更多个对象分配区域(代)。最年轻的一代包含最新分配的对象,并且经常清理。在某个时间段内存活的对象被提升为老一代。

许多使用 GC 的语言允许程序员对其进行微调(例如,参见 Java 8 虚拟机垃圾收集调整指南.Net 垃圾收集文档