module Ephemeron:sig
..end
Ephemeron 和弱雜湊表。
當想要快取或記憶函數的計算結果時,只要參數和函數被使用,Ephemeron 和弱雜湊表就很有用,它們不會因為持續保留不再有用的舊計算結果(因為某個參數或函數被釋放)而造成記憶體洩漏。使用 Hashtbl.t
的實作並不適用,因為所有關聯都會將參數和結果保留在記憶體中。
Ephemeron 也可用於「添加」欄位到任意裝箱的 OCaml 值:您可以將一些資訊附加到由外部函式庫建立的值,而不會產生記憶體洩漏。
Ephemeron 持有一些鍵,以及一個或零個資料。它們都是裝箱的 OCaml 值。根據垃圾收集器,ephemeron 的鍵具有與弱指標相同的行為。事實上,OCaml 弱指標是以沒有資料的 ephemeron 實作的。
如果 ephemeron 的鍵和資料指向一個值,則稱其為「滿的」,如果值從未被設定、已被取消設定或被 GC 清除,則稱其為「空的」。在存取鍵或資料的函式中,這兩種狀態由 option
類型表示。
如果所有「滿的」鍵都是活的,並且 ephemeron 是活的,則垃圾收集器會認為資料是活的。當 GC 不再認為其中一個鍵是活的時,資料會從 ephemeron 中清空。資料可能因為其他原因而存活,在這種情況下,GC 不會釋放它,但 ephemeron 將不再持有該資料。
Ephemeron 使值的存活性概念變得複雜,因為它不再等同於從根值通過普通指標(非弱指標和非 ephemeron)的可達性。使用 ephemeron,存活性的概念是通過最小不動點建構的:一個值是活的,如果
注意事項
output_value
或 Marshal
模組的函式進行序列化。Ephemeron 在這篇論文中以語言無關的方式定義:B. Hayes, Ephemerons: A New Finalization Mechanism, OOPSLA'97
未同步存取
對弱雜湊表的未同步存取可能會導致弱雜湊表狀態無效。因此,對緩衝區的並行存取必須同步(例如使用 Mutex.t
)。
module type S =sig
..end
函式子 Ephemeron.K1.Make
和 Ephemeron.K2.Make
的輸出簽章。
module type SeededS =sig
..end
函式子 Ephemeron.K1.MakeSeeded
和 Ephemeron.K2.MakeSeeded
的輸出簽章。
module K1:sig
..end
具有一個鍵的 Ephemeron。
module K2:sig
..end
具有兩個鍵的 Ephemeron。
module Kn:sig
..end
具有任意數量的相同類型鍵的 Ephemeron。