Module Async_kernel__.Async_gc

Async's analog of Core_kernel.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

Memory management control and statistics; finalized values.

This is a wrapper around INRIA's standard Gc module.

type stat = Stat.t

The memory management counters are returned in a stat record.

The total amount of memory allocated by the program since it was started is (in words) minor_words + major_words - promoted_words. Multiply by the word size (4 on a 32-bit machine, 8 on a 64-bit machine) to get the number of bytes.

type control = Control.t

The GC parameters are given as a control record. Note that these parameters can also be initialised by setting the OCAMLRUNPARAM environment variable. See the documentation of ocamlrun.

external stat : Core_kernel__.Import.unit ‑> stat = "caml_gc_stat"

Return the current values of the memory management counters in a stat record. This function examines every heap block to get the statistics.

external quick_stat : Core_kernel__.Import.unit ‑> stat = "caml_gc_quick_stat"

Same as stat except that live_words, live_blocks, free_words, free_blocks, largest_free, and fragments are set to 0. This function is much faster than stat because it does not need to go through the heap.

Return (minor_words, promoted_words, major_words). This function is as fast at quick_stat.

external minor_words : Core_kernel__.Import.unit ‑> Core_kernel__.Import.int = "core_kernel_gc_minor_words"

The following functions return the same as (Gc.quick_stat ()).Stat.f, avoiding any allocation (of the stat record or a float). On 32-bit machines the int may overflow.

Note that minor_words does not allocate, but we do not annotate it as noalloc because we want the compiler to save the value of the allocation pointer register (%r15 on x86-64) to the global variable caml_young_ptr before the C stub tries to read its value.

external major_words : Core_kernel__.Import.unit ‑> Core_kernel__.Import.int = "core_kernel_gc_major_words"
external promoted_words : Core_kernel__.Import.unit ‑> Core_kernel__.Import.int = "core_kernel_gc_promoted_words"
external minor_collections : Core_kernel__.Import.unit ‑> Core_kernel__.Import.int = "core_kernel_gc_minor_collections"
external major_collections : Core_kernel__.Import.unit ‑> Core_kernel__.Import.int = "core_kernel_gc_major_collections"
external heap_words : Core_kernel__.Import.unit ‑> Core_kernel__.Import.int = "core_kernel_gc_heap_words"
external heap_chunks : Core_kernel__.Import.unit ‑> Core_kernel__.Import.int = "core_kernel_gc_heap_chunks"
external compactions : Core_kernel__.Import.unit ‑> Core_kernel__.Import.int = "core_kernel_gc_compactions"
external top_heap_words : Core_kernel__.Import.unit ‑> Core_kernel__.Import.int = "core_kernel_gc_top_heap_words"
external major_plus_minor_words : Core_kernel__.Import.unit ‑> Core_kernel__.Import.int = "core_kernel_gc_major_plus_minor_words"

This function returns major_words () + minor_words (). It exists purely for speed (one call into C rather than two). Like major_words and minor_words, major_plus_minor_words avoids allocating a stat record 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.

external get : Core_kernel__.Import.unit ‑> control = "caml_gc_get"

Return the current values of the GC parameters in a control record.

external set : control ‑> Core_kernel__.Import.unit = "caml_gc_set"

set r changes the GC parameters according to the control record r. The normal usage is: Gc.set { (Gc.get()) with Gc.Control.verbose = 0x00d }

external minor : Core_kernel__.Import.unit ‑> Core_kernel__.Import.unit = "caml_gc_minor"

Trigger a minor collection.

external major_slice : Core_kernel__.Import.int ‑> Core_kernel__.Import.int = "caml_gc_major_slice"

Do 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.

external major : Core_kernel__.Import.unit ‑> Core_kernel__.Import.unit = "caml_gc_major"

Do a minor collection and finish the current major collection cycle.

external full_major : Core_kernel__.Import.unit ‑> Core_kernel__.Import.unit = "caml_gc_full_major"

Do a minor collection, finish the current major collection cycle, and perform a complete new cycle. This will collect all currently unreachable blocks.

external compact : Core_kernel__.Import.unit ‑> Core_kernel__.Import.unit = "caml_gc_compaction"

Perform a full major collection and compact the heap. Note that heap compaction is a lengthy operation.

val print_stat : Pervasives.out_channel ‑> Core_kernel__.Import.unit

Print the current values of the memory management counters (in human-readable form) into the channel argument.

Return the total number of bytes allocated since the program was started. It is returned as a float to avoid overflow problems with int on 32-bit machines.

val keep_alive : _ ‑> Core_kernel__.Import.unit

keep_alive a ensures that a is live at the point where keep_alive a is called. It is like ignore a, except that the compiler won't be able to simplify it and potentially collect a too soon.

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:Core_kernel__.Import.int ‑> ?window_size:Core_kernel__.Import.int ‑> Core_kernel__.Import.unit ‑> Core_kernel__.Import.unit

Adjust the specified GC parameters.

module Allocation_policy = Core_kernel__.Core_gc.Allocation_policy

The policy used for allocating in the heap.

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

The Expert module contains functions that novice users should not use, due to their complexity.

val add_finalizer : 'a Core_kernel.Heap_block.t ‑> ('a Core_kernel.Heap_block.t ‑> unit) ‑> unit

add_finalizer b f ensures that f runs after b becomes unreachable. f b will run in its own Async job. If f raises, the unhandled exception will be raised to the monitor that called add_finalizer b f.

The OCaml runtime only supports finalizers on heap blocks, hence add_finalizer requires b : _ Heap_block.t. add_finalizer_exn b f is like add_finalizer, but will raise if b is not a heap block.

The runtime essentially maintains a set of finalizer pairs:

      'a Heap_block.t * ('a Heap_block.t -> unit)
    

Each call to add_finalizer adds 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 b is unreachable, it removes from the set of finalizers all finalizer pairs (b, f) whose block is b, and then and runs f b for all such pairs. Thus, a finalizer registered with add_finalizer will run at most once.

In a finalizer pair (b, f), it is a mistake for the closure of f to reference (directly or indirectly) b -- f should only access b via its argument. Referring to b in any other way will cause b to be kept alive forever, since f itself 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 f function can use all features of OCaml and Async, since it runs as an ordinary Async job. f can even make make b reachable again. It can even call add_finalizer on b or other values to register other finalizer functions.

val add_finalizer_exn : 'a ‑> ('a ‑> unit) ‑> unit
module Alarm : sig ... end

A GC alarm calls a user function after the end of each major GC cycle.