模組 Ephemeron

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,存活性的概念是通過最小不動點建構的:一個值是活的,如果

  • 它是一個根值
  • 它可以從活的值通過普通指標到達
  • 它是具有所有活的「滿的」鍵的活的 ephemeron 的資料

注意事項

  • 此模組中定義的所有類型都不能使用 output_valueMarshal 模組的函式進行序列化。

Ephemeron 在這篇論文中以語言無關的方式定義:B. Hayes, Ephemerons: A New Finalization Mechanism, OOPSLA'97


未同步存取

對弱雜湊表的未同步存取可能會導致弱雜湊表狀態無效。因此,對緩衝區的並行存取必須同步(例如使用 Mutex.t)。

module type S = sig .. end

函式子 Ephemeron.K1.MakeEphemeron.K2.Make 的輸出簽章。

module type SeededS = sig .. end

函式子 Ephemeron.K1.MakeSeededEphemeron.K2.MakeSeeded 的輸出簽章。

module K1: sig .. end

具有一個鍵的 Ephemeron。

module K2: sig .. end

具有兩個鍵的 Ephemeron。

module Kn: sig .. end

具有任意數量的相同類型鍵的 Ephemeron。