module Gc:Memory management control and statistics; finalised values.sig
..end
module Stat:sig
..end
typestat =
Stat.t
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.
module Control:sig
..end
typecontrol =
Control.t
control
record.
Note that these parameters can also be initialised
by setting the OCAMLRUNPARAM environment variable.
See the documentation of ocamlrun.val stat : unit -> stat
stat
record. This function examines every heap block to get the
statistics.val quick_stat : unit -> stat
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.val counters : unit -> float * float * float
(minor_words, promoted_words, major_words)
. This function
is as fast at quick_stat
.val get : unit -> control
control
record.val set : control -> unit
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 }
val minor : unit -> unit
val major_slice : int -> int
val major : unit -> unit
val full_major : unit -> unit
val compact : unit -> unit
val print_stat : Pervasives.out_channel -> unit
val allocated_bytes : unit -> float
float
to avoid overflow problems
with int
on 32-bit machines.val add_finalizer : 'a Heap_block.t -> ('a Heap_block.t -> unit) -> unit
add_finalizer b f
ensures that f
runs after b
becomes unreachable. The
OCaml runtime only supports finalizers on heap blocks, hence add_finalizer
requires
b : _ 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_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.
The GC will call the finalisation functions in the order of deallocation. When
several values become unreachable at the same time (i.e. during the same GC cycle),
the finalisation functions will be called in the reverse order of the corresponding
calls to add_finalizer
. If add_finalizer
is called in the same order as the
values are allocated, that means each value is finalised before the values it depends
upon. Of course, this becomes false if additional dependencies are introduced by
assignments.
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 O'Caml, including assignments that make the
value reachable again. It can also loop forever (in this case, the other finalisation
functions will be called during the execution of f). It can call add_finalizer
on
v
or other values to register other functions or even itself. It can raise an
exception; in this case the exception will interrupt whatever the program was doing
when the function was called.
add_finalizer_exn b f
is like add_finalizer
, but will raise if b
is not a
heap block.
val add_finalizer_exn : 'a -> ('a -> unit) -> unit
val finalise_release : unit -> unit
finalise_release
to tell the
GC that it can launch the next finalisation function without waiting
for the current one to return.type
alarm
val create_alarm : (unit -> unit) -> alarm
create_alarm f
will arrange for f
to be called at the end of each
major GC cycle, starting with the current cycle or the next one.
A value of type alarm
is returned that you can
use to call delete_alarm
.val delete_alarm : alarm -> unit
delete_alarm a
will stop the calls to the function associated
to a
. Calling delete_alarm a
again has no effect.val tune : ?logger:(string -> unit) ->
?minor_heap_size:int ->
?major_heap_increment:int ->
?space_overhead:int ->
?verbose:int ->
?max_overhead:int ->
?stack_limit:int -> ?allocation_policy:int -> unit -> unit