簡體   English   中英

Boehm GC如何為C程序工作?

[英]How does Boehm GC work for C program?

我檢查了Boehm GC。 用於C / C ++的GC。

我知道標記和掃描算法。 我很好奇的是它如何只在整個C內存中獲取指針。 我對C內存的理解只是一個普通的字節數組。 是否有可能確定內存中的值是否為指針?

Boehm GC是一個保守的收集器,這意味着它假設一切都是指針。 這意味着它可以找到誤報引用,就像一個巧合地具有堆中地址值的整數。 結果,一些塊可能比非保守的收集器在內存中停留的時間更長。

以下是Boehm頁面的描述:

垃圾收集器使用修改的標記掃描算法。 從概念上講,它大致分四個階段運行,偶爾作為內存分配的一部分執行:

  1. 准備每個對象都有一個關聯的標記位。 清除所有標記位,表示所有對象都可能無法訪問。
  2. 標記階段標記可通過變量指針鏈到達的所有對象。 收集器通常沒有關於堆中指針變量位置的真實信息,因此它將所有靜態數據區域,堆棧和寄存器視為可能包含指針。 表示收集器管理的堆對象內的地址的任何位模式都被視為指針。 除非客戶端程序已將堆對象布局信息提供給收集器,否則將再次以類似方式掃描發現可從變量訪問的任何堆對象。
  3. 掃描階段掃描堆中的不可訪問的,因此未標記的對象,並將它們返回到適當的空閑列表以供重用。 這不是一個單獨的階段; 即使在非增量模式下,這也是通常在發現空閑列表的分配期間按需執行操作。 因此,掃描階段不太可能觸及此后不久就不會被觸摸的頁面。
  4. 結束階段已注冊完成的無法訪問的對象將排隊,以便在收集器外部完成。

您還應該知道Boehm GC需要給出一組“根”,它們是標記和掃描算法的起點。 堆棧和寄存器是自動根。 您需要顯式添加全局指針作為根。


編輯:在評論中,一般關注保守收藏家的一些擔憂。 確實,看起來像收集器的堆指針的整數會導致內存不被釋放。 這並不像你想象的那么大。 程序中的大多數標量整數用於計數和大小,並且相當小(因此它們看起來不像堆指針)。 您將主要遇到包含位圖,字符串,浮點數據或任何類型的數組的問題。 Boehm GC允許您使用GC_MALLOC_ATOMIC分配一個塊,該塊向收集器指示該塊不包含任何指針。 如果查看gc_typed.h ,您還可以找到指定塊的哪些部分可能包含指針的方法。

也就是說,保守收集器的一個基本限制是它在收集過程中不能安全地移動內存,因為指針重寫是不安全的。 這意味着您將無法獲得壓縮的任何好處,例如降低碎片和提高緩存性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM