跳轉到內容

D 程式設計/垃圾回收器

來自華夏公益教科書,開放的書籍,開放的世界

此頁面應作為實際 GC 實現的內部機制、介面、限制等的文件。

實際實現具有以下特點

  • 保守的(與精確的和內部指標相比)
  • 停止世界(與增量式和併發式相比)
  • 標記和清除(與複製相比)
  • 非移動式(與移動式相比)

另請參見 垃圾收集

檔案結構

[編輯 | 編輯原始碼]
std.thread
使用實際的棧指標位置支援 GC。
/internal/gc/gc.d
GC 介面,實現的包裝器。
/internal/gc/gcx.d
GC 實現
/internal/gc/gcstub.d
GC 的存根,防止連結到應用程式

執行緒

[編輯 | 編輯原始碼]

為了停止世界,gc 呼叫 Thread.pauseAll()。Linux 上的停止機制使用訊號 SIGUSR1 和 SIGUSR2。在暫停執行緒的情況下,訊號處理程式將當前棧指標儲存在 stackTop 中,因此該指標始終是最新的。

它是如何工作的

[編輯 | 編輯原始碼]

GC 僅在需要分配記憶體且當前沒有可用記憶體時呼叫。如果 gc 無法釋放足夠的記憶體,則會從系統請求新的記憶體。

入口點是 gcx.d fullCollect()

  1. 標記階段
    1. 掃描所有執行緒的棧
    2. 掃描根(全域性變數)
    3. 掃描範圍(非 GC 管理的記憶體,其中也可能包含對 GC 物件的引用)
  2. 完成所有收集的物件
  3. 清除未使用的記憶體

更多資訊

[編輯 | 編輯原始碼]

關於更好 GC 實現的想法

華夏公益教科書