垃圾收集入門

垃圾收集(GC)是一種自動回收由程式不再需要的物件佔用的記憶體的方法。這與手動記憶體管理形成對比,其中程式設計師明確指定應該釋放哪些物件並將其返回到記憶體。好的 GC 策略比手動記憶體管理更有效,但它可能取決於軟體的型別。

垃圾收集的主要優點是:

  • 它使程式設計師不必進行手動記憶體管理。
  • 它避免了手動記憶體管理可能產生的某些難以發現的錯誤(例如懸空指標,雙重釋放,某些型別的記憶體洩漏)。
  • 使用垃圾收集的語言通常不那麼複雜。

主要缺點是:

  • 與手動記憶體管理相比,垃圾收集有一些開銷。
  • 它可能會影響效能,尤其是在不需要的時刻觸發垃圾收集時。
  • 它是不確定的,程式設計師不知道何時完成垃圾收集以及是否釋放了物件。

大多數較新的程式語言都內建了垃圾收集,例如 Java,C#,.NET,Ruby 和 JavaScript。像 C 和 C++這樣的舊語言沒有垃圾收集,儘管有垃圾收集可用的實現。還有一些語言允許你使用垃圾收集和手動記憶體管理的組合,例如 Modula-3 和 Ada。

垃圾收集策略不同,但許多人使用標記和掃描方法的(變體)。在標記階段,找到並標記所有可訪問的物件。在掃描階段,掃描堆以查詢無法訪問和未標記的物件,然後清除這些物件。現代垃圾收集器還使用分代方法,其中保留兩個或更多個物件分配區域(代)。最年輕的一代包含最新分配的物件,並且經常清理。在某個時間段內存活的物件被提升為老一代。

許多使用 GC 的語言允許程式設計師對其進行微調(例如,參見 Java 8 虛擬機器垃圾收集調整指南.Net 垃圾收集文件