簡體   English   中英

Boehm 垃圾收集器中的精確模式

[英]Precise mode in Boehm Garbage Collector

我在 Mono 的網頁上讀到他們在精確模式下使用 Boehm GC。 我也將 Boehm GC 與 C++ 一起使用,但是,我在其文檔或標題中沒有發現任何表明精確模式的內容,更不用說如何打開它了。

任何信息是否它實際上具有默認的精確模式以及如何打開它,或者它只是 Mono 開發人員的某種修改?

Mono 下的 Boehm GC 中的精確模式不僅僅是GC_MALLOC_ATOMIC 這僅適用於基本類型的 arrays。

對於托管類型,使用GC_gcj_malloc Mono 的編譯器為每個托管類型生成一個 object 描述符,然后它簡單地使用大小參數調用GC_gcj_malloc和指向托管類型描述符的指針。 Boehm GC 然后在標記階段引用描述符以跟蹤托管指針。

您最終只會將根指針作為原始指針放在堆棧上( GC_gcj_malloc返回一個 void* 並且無法通過 GC 收集之前的某種堆棧描述符告訴 GC 指針在堆棧上的位置)。 這就是 Mono(在 SGen 之前)說他們以保守模式掃描堆棧的原因。

如果您想在 C++ 下實現此功能,您將無法簡單地依賴 C++ 編譯器為您生成 object 描述符。 What I envisioned a long time ago was to write an intermediate compiler that parses all your C++ header files for class definitions that have been marked as managed class (eg _ref class MyManagedObject where _ref is simply a #define to nothing) and generate a header file包含那些 object 描述符。 然后,您將使用GC_make_descriptorGC_malloc_explicitly_typed函數以精確模式而不是GC_gcj_malloc分配對象,因為您無法控制 C++ 編譯器如何分配其 vtable。

*編輯:有關GCC(開源 GPL v3),請參閱托管 C++

來自垃圾收集器(此處存檔)的文件 doc/gcinterface.html 指出:

void * GC_MALLOC_ATOMIC(size_t nbytes) 分配 nbytes 的存儲空間。 需要與 nbytes 成比例的(攤銷)時間。 生成的 object 將在未引用時自動釋放。 客戶端承諾生成的 object 永遠不會包含任何指針。 memory 未被清除。 這是分配字符串、浮點 arrays、位圖等的首選方式。有關指針位置的更精確信息可以使用分發中的 gc_typed.h 中的接口傳達給收集器。

看起來有一個可以使用的“精確”界面。

我相信精確模式需要編譯器的支持才能准確指示指針的存儲位置。 C 和 C++ 中的類型轉換使得這幾乎是不可能的。

具有內置反射的托管語言將使這變得容易得多。

暫無
暫無

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

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