Module Async_kernel__.Async_gc
We remove the Expert module, which has functions that are superseded by Async-friendly functions below.
include module type of Core_kernel.Gc with module Gc.Expert := Core_kernel.Gc.Expert
module Stat = Core_kernel.Gc.Stattype stat= Stat.t
module Control = Core_kernel.Gc.Controltype control= Control.t
val stat : Core_kernel__.Import.unit -> statReturn the current values of the memory management counters in a
statrecord. This function examines every heap block to get the statistics.
val quick_stat : Core_kernel__.Import.unit -> statSame as
statexcept thatlive_words,live_blocks,free_words,free_blocks,largest_free, andfragmentsare set to 0. This function is much faster thanstatbecause it does not need to go through the heap.
val counters : Core_kernel__.Import.unit -> Core_kernel__.Import.float * Core_kernel__.Import.float * Core_kernel__.Import.floatReturn
(minor_words, promoted_words, major_words). This function is as fast atquick_stat.
val minor_words : Core_kernel__.Import.unit -> Core_kernel__.Import.intThe following functions return the same as
(Gc.quick_stat ()).Stat.f, avoiding any allocation (of thestatrecord or a float). On 32-bit machines theintmay overflow.Note that
minor_wordsdoes not allocate, but we do not annotate it asnoallocbecause we want the compiler to save the value of the allocation pointer register (%r15 on x86-64) to the global variablecaml_young_ptrbefore the C stub tries to read its value.
val major_words : Core_kernel__.Import.unit -> Core_kernel__.Import.intval promoted_words : Core_kernel__.Import.unit -> Core_kernel__.Import.intval minor_collections : Core_kernel__.Import.unit -> Core_kernel__.Import.intval major_collections : Core_kernel__.Import.unit -> Core_kernel__.Import.intval heap_words : Core_kernel__.Import.unit -> Core_kernel__.Import.intval heap_chunks : Core_kernel__.Import.unit -> Core_kernel__.Import.intval compactions : Core_kernel__.Import.unit -> Core_kernel__.Import.intval top_heap_words : Core_kernel__.Import.unit -> Core_kernel__.Import.intval major_plus_minor_words : Core_kernel__.Import.unit -> Core_kernel__.Import.intThis function returns
major_words () + minor_words (). It exists purely for speed (one call into C rather than two). Likemajor_wordsandminor_words,major_plus_minor_wordsavoids allocating astatrecord or a float, and may overflow on 32-bit machines.This function is not marked
[@@noalloc]to ensure that the allocation pointer is up-to-date when the minor-heap measurement is made.
val allocated_words : Core_kernel__.Import.unit -> Core_kernel__.Import.intThis function returns
major_words () - promoted_words () + minor_words (), as fast as possible. Asmajor_plus_minor_words, we avoid allocating but cannot be marked@@noallocyet. It may overflow in 32-bit mode.
val get : Core_kernel__.Import.unit -> controlReturn the current values of the GC parameters in a
controlrecord.
val set : control -> Core_kernel__.Import.unitset rchanges the GC parameters according to thecontrolrecordr. The normal usage is:Gc.set { (Gc.get()) with Gc.Control.verbose = 0x00d }
val minor : Core_kernel__.Import.unit -> Core_kernel__.Import.unitTrigger a minor collection.
val major_slice : Core_kernel__.Import.int -> Core_kernel__.Import.intDo a minor collection and a slice of major collection. The argument is the size of the slice, 0 to use the automatically-computed slice size. In all cases, the result is the computed slice size.
val major : Core_kernel__.Import.unit -> Core_kernel__.Import.unitDo a minor collection and finish the current major collection cycle.
val full_major : Core_kernel__.Import.unit -> Core_kernel__.Import.unitDo a minor collection, finish the current major collection cycle, and perform a complete new cycle. This will collect all currently unreachable blocks.
val compact : Core_kernel__.Import.unit -> Core_kernel__.Import.unitPerform a full major collection and compact the heap. Note that heap compaction is a lengthy operation.
val print_stat : Stdlib.out_channel -> Core_kernel__.Import.unitPrint the current values of the memory management counters (in human-readable form) into the channel argument.
val allocated_bytes : Core_kernel__.Import.unit -> Core_kernel__.Import.floatReturn the total number of bytes allocated since the program was started. It is returned as a
floatto avoid overflow problems withinton 32-bit machines.
val keep_alive : _ -> Core_kernel__.Import.unitkeep_alive aensures thatais live at the point wherekeep_alive ais called. It is likeignore a, except that the compiler won't be able to simplify it and potentially collectatoo soon.
module Allocation_policy = Core_kernel.Gc.Allocation_policyThe policy used for allocating in the heap.
val tune : ?logger:(Core_kernel__.Import.string -> Core_kernel__.Import.unit) -> ?minor_heap_size:Core_kernel__.Import.int -> ?major_heap_increment:Core_kernel__.Import.int -> ?space_overhead:Core_kernel__.Import.int -> ?verbose:Core_kernel__.Import.int -> ?max_overhead:Core_kernel__.Import.int -> ?stack_limit:Core_kernel__.Import.int -> ?allocation_policy:Allocation_policy.t -> ?window_size:Core_kernel__.Import.int -> ?custom_major_ratio:Core_kernel__.Import.int -> ?custom_minor_ratio:Core_kernel__.Import.int -> ?custom_minor_max_size:Core_kernel__.Import.int -> Core_kernel__.Import.unit -> Core_kernel__.Import.unitAdjust the specified GC parameters.
val disable_compaction : ?logger:(Core_kernel__.Import.string -> Core_kernel__.Import.unit) -> allocation_policy:[ `Don't_change | `Set_to of Allocation_policy.t ] -> Core_kernel__.Import.unit -> Core_kernel__.Import.unit
module For_testing = Core_kernel.Gc.For_testingmodule Expert = Core_kernel.Gc.ExpertThe
Expertmodule contains functions that novice users should not use, due to their complexity.
module Stable = Core_kernel.Gc.Stableval add_finalizer : 'a Core_kernel.Heap_block.t -> ('a Core_kernel.Heap_block.t -> unit) -> unitadd_finalizer b fensures thatfruns afterbbecomes unreachable.f bwill run in its own Async job. Iffraises, the unhandled exception will be raised to the monitor that calledadd_finalizer b f.The OCaml runtime only supports finalizers on heap blocks, hence
add_finalizerrequiresb : _ Heap_block.t.The runtime essentially maintains a set of finalizer pairs:
'a Heap_block.t * ('a Heap_block.t -> unit)Each call to
add_finalizeradds a new pair to the set. It is allowed for many pairs to have the same heap block, the same function, or both. Each pair is a distinct element of the set.After a garbage collection determines that a heap block
bis unreachable, it removes from the set of finalizers all finalizer pairs(b, f)whose block isb, and then and runsf bfor all such pairs. Thus, a finalizer registered withadd_finalizerwill run at most once.In a finalizer pair
(b, f), it is a mistake for the closure offto reference (directly or indirectly)b--fshould only accessbvia its argument. Referring tobin any other way will causebto be kept alive forever, sincefitself is a root of garbage collection, and can itself only be collected after the pair(b, f)is removed from the set of finalizers.The
ffunction can use all features of OCaml and Async, since it runs as an ordinary Async job.fcan even makebreachable again. It can even calladd_finalizeronbor other values to register other finalizer functions.
val add_finalizer_exn : 'a -> ('a -> unit) -> unitadd_finalizer_exn b fis likeadd_finalizer, but will raise ifbis not a heap block.
val add_finalizer_last : 'a Core_kernel.Heap_block.t -> (unit -> unit) -> unitSame as
add_finalizerexcept that the function is not called until the value has become unreachable for the last time. This means that the finalization function does not receive the value as an argument. Every weak pointer and ephemeron that contained this value as key or data is unset before running the finalization function.
module Alarm : sig ... endA GC alarm calls a user function after the end of each major GC cycle.