1Gc(3)                            OCaml library                           Gc(3)
2
3
4

NAME

6       Gc - Memory management control and statistics; finalised values.
7

Module

9       Module   Gc
10

Documentation

12       Module Gc
13        : sig end
14
15
16       Memory management control and statistics; finalised values.
17
18
19
20
21
22       type stat = {
23        minor_words  : float ;  (* Number of words allocated in the minor heap
24       since the program was started.
25        *)
26        promoted_words : float ;  (* Number of words allocated  in  the  minor
27       heap  that survived a minor collection and were moved to the major heap
28       since the program was started.
29        *)
30        major_words : float ;  (* Number of words allocated in the major heap,
31       including the promoted words, since the program was started.
32        *)
33        minor_collections  :  int  ;  (* Number of minor collections since the
34       program was started.
35        *)
36        major_collections : int ;  (* Number of major collection  cycles  com‐
37       pleted since the program was started.
38        *)
39        heap_words : int ;  (* Total size of the major heap, in words.
40        *)
41        heap_chunks  :  int  ;   (* Number of contiguous pieces of memory that
42       make up the major heap.
43        *)
44        live_words : int ;  (* Number of words of live data in the major heap,
45       including the header words.
46
47       Note  that  "live"  words  refers  to every word in the major heap that
48       isn't currently known to be collectable, which includes words that have
49       become  unreachable  by  the program after the start of the previous gc
50       cycle.  It is typically much  simpler  and  more  predictable  to  call
51       Gc.full_major  (or Gc.compact ) then computing gc stats, as then "live"
52       words has the simple meaning of "reachable by the program". One  caveat
53       is  that  a  single  call to Gc.full_major will not reclaim values that
54       have a finaliser from  Gc.finalise  (this  does  not  apply  to  Gc.fi‐
55       nalise_last  ). If this caveat matters, simply call Gc.full_major twice
56       instead of once.
57        *)
58        live_blocks : int ;  (* Number of live blocks in the major heap.
59
60       See live_words for a caveat about what "live" means.
61        *)
62        free_words : int ;  (* Number of words in the free list.
63        *)
64        free_blocks : int ;  (* Number of blocks in the free list.
65        *)
66        largest_free : int ;  (* Size (in words) of the largest block  in  the
67       free list.
68        *)
69        fragments  :  int  ;   (* Number of wasted words due to fragmentation.
70       These are 1-words free blocks placed between two live blocks.  They are
71       not available for allocation.
72        *)
73        compactions  :  int ;  (* Number of heap compactions since the program
74       was started.
75        *)
76        top_heap_words : int ;  (* Maximum size reached by the major heap,  in
77       words.
78        *)
79        stack_size : int ;  (* Current size of the stack, in words.
80
81
82       Since 3.12.0
83        *)
84        forced_major_collections  : int ;  (* Number of forced full major col‐
85       lections completed since the program was started.
86
87
88       Since 4.12.0
89        *)
90        }
91
92
93       The memory management counters are returned in  a  stat  record.  These
94       counters give values for the whole program.
95
96       The  total  amount  of  memory  allocated  by  the program since it was
97       started is (in words) minor_words  +  major_words  -  promoted_words  .
98       Multiply  by  the  word  size (4 on a 32-bit machine, 8 on a 64-bit ma‐
99       chine) to get the number of bytes.
100
101
102       type control = {
103        minor_heap_size : int ;  (* The size (in words)  of  the  minor  heap.
104       Changing this parameter will trigger a minor collection. The total size
105       of the minor heap used by this program is the sum of the heap sizes  of
106       the active domains. Default: 256k.
107        *)
108        major_heap_increment  :  int  ;   (* How much to add to the major heap
109       when increasing it. If this number is less than or equal to 1000, it is
110       a percentage of the current heap size (i.e. setting it to 100 will dou‐
111       ble the heap size at each increase). If it is more than 1000, it  is  a
112       fixed number of words that will be added to the heap. Default: 15.
113        *)
114        space_overhead  :  int  ;  (* The major GC speed is computed from this
115       parameter.  This is the memory that will be  "wasted"  because  the  GC
116       does  not immediately collect unreachable blocks.  It is expressed as a
117       percentage of the memory used for live data.  The  GC  will  work  more
118       (use  more  CPU time and collect blocks more eagerly) if space_overhead
119       is smaller.  Default: 120.
120        *)
121        verbose : int ;  (* This value controls the GC  messages  on  standard
122       error  output.   It  is  a sum of some of the following flags, to print
123       messages on the corresponding events:
124
125       - 0x001 Start and end of major GC cycle.
126
127       - 0x002 Minor collection and major GC slice.
128
129       - 0x004 Growing and shrinking of the heap.
130
131       - 0x008 Resizing of stacks and memory manager tables.
132
133       - 0x010 Heap compaction.
134
135       - 0x020 Change of GC parameters.
136
137       - 0x040 Computation of major GC slice size.
138
139       - 0x080 Calling of finalisation functions.
140
141       - 0x100 Bytecode executable and shared library search at start-up.
142
143       - 0x200 Computation of compaction-triggering condition.
144
145       - 0x400 Output GC statistics at program exit.  Default: 0.
146
147        *)
148        max_overhead : int ;  (* Heap compaction is triggered when  the  esti‐
149       mated  amount  of  "wasted" memory is more than max_overhead percent of
150       the amount of live data.  If max_overhead is set to 0, heap  compaction
151       is  triggered  at  the  end of each major GC cycle (this setting is in‐
152       tended for testing purposes only).  If max_overhead >= 1000000  ,  com‐
153       paction  is never triggered.  If compaction is permanently disabled, it
154       is strongly suggested to set allocation_policy to 2.  Default: 500.
155        *)
156        stack_limit : int ;  (* The maximum  size  of  the  fiber  stacks  (in
157       words).  Default: 1024k.
158        *)
159        allocation_policy  :  int  ;  (* The policy used for allocating in the
160       major heap.  Possible values are 0, 1 and 2.
161
162
163       -0 is the next-fit policy, which is usually  fast  but  can  result  in
164       fragmentation, increasing memory consumption.
165
166
167       -1  is  the first-fit policy, which avoids fragmentation but has corner
168       cases (in certain realistic workloads) where it is sensibly slower.
169
170
171       -2 is the best-fit policy, which is fast and avoids  fragmentation.  In
172       our  experiments  it  is faster and uses less memory than both next-fit
173       and first-fit.  (since OCaml 4.10)
174
175       The default is best-fit.
176
177       On one example that was known to be bad  for  next-fit  and  first-fit,
178       next-fit  takes  28s  using 855Mio of memory, first-fit takes 47s using
179       566Mio of memory, best-fit takes 27s using 545Mio of memory.
180
181       Note: If you change to next-fit, you may need to reduce the space_over‐
182       head  setting, for example using 80 instead of the default 120 which is
183       tuned for best-fit. Otherwise, your program will need more memory.
184
185       Note: changing the allocation policy at run-time  forces  a  heap  com‐
186       paction, which is a lengthy operation unless the heap is small (e.g. at
187       the start of the program).
188
189       Default: 2.
190
191
192       Since 3.11.0
193        *)
194        window_size : int ;  (* The size of the window used by  the  major  GC
195       for  smoothing  out  variations in its workload. This is an integer be‐
196       tween 1 and 50.  Default: 1.
197
198
199       Since 4.03.0
200        *)
201        custom_major_ratio : int ;  (* Target ratio of floating garbage to ma‐
202       jor  heap  size for out-of-heap memory held by custom values located in
203       the major heap. The GC speed is adjusted to try to use this much memory
204       for  dead  values that are not yet collected. Expressed as a percentage
205       of major heap size. The default value keeps  the  out-of-heap  floating
206       garbage  about  the same size as the in-heap overhead.  Note: this only
207       applies to values allocated  with  caml_alloc_custom_mem  (e.g.  bigar‐
208       rays).  Default: 44.
209
210
211       Since 4.08.0
212        *)
213        custom_minor_ratio   :  int  ;   (*  Bound  on  floating  garbage  for
214       out-of-heap memory held by custom values in the minor heap. A minor  GC
215       is  triggered when this much memory is held by custom values located in
216       the minor heap. Expressed as a percentage of minor  heap  size.   Note:
217       this  only applies to values allocated with caml_alloc_custom_mem (e.g.
218       bigarrays).  Default: 100.
219
220
221       Since 4.08.0
222        *)
223        custom_minor_max_size : int ;  (* Maximum amount of out-of-heap memory
224       for  each custom value allocated in the minor heap. When a custom value
225       is allocated on the minor heap and holds more  than  this  many  bytes,
226       only  this  value is counted against custom_minor_ratio and the rest is
227       directly counted against custom_major_ratio .  Note: this only  applies
228       to  values  allocated with caml_alloc_custom_mem (e.g. bigarrays).  De‐
229       fault: 8192 bytes.
230
231
232       Since 4.08.0
233        *)
234        }
235
236
237       The GC parameters are given as a control record.  Note that  these  pa‐
238       rameters  can also be initialised by setting the OCAMLRUNPARAM environ‐
239       ment variable.  See the documentation of ocamlrun .
240
241
242
243       val stat : unit -> stat
244
245       Return the current values of the memory management counters in  a  stat
246       record  that represent the program's total memory stats.  This function
247       causes a full major collection.
248
249
250
251       val quick_stat : unit -> stat
252
253       Same as stat except  that  live_words  ,  live_blocks  ,  free_words  ,
254       free_blocks , largest_free , and fragments are set to 0. Due to per-do‐
255       main buffers it may only represent the state  of  the  program's  total
256       memory  usage  since  the  last minor collection. This function is much
257       faster than stat because it does not need to trigger a full major  col‐
258       lection.
259
260
261
262       val counters : unit -> float * float * float
263
264       Return  (minor_words,  promoted_words, major_words) for the current do‐
265       main or potentially previous domains.  This  function  is  as  fast  as
266       quick_stat .
267
268
269
270       val minor_words : unit -> float
271
272       Number  of  words  allocated in the minor heap by this domain or poten‐
273       tially previous domains. This number is accurate in byte-code programs,
274       but only an approximation in programs compiled to native code.
275
276       In native code this function does not allocate.
277
278
279       Since 4.04
280
281
282
283       val get : unit -> control
284
285       Return the current values of the GC parameters in a control record.
286
287
288       Alert unsynchronized_access.  GC parameters are a mutable global state.
289
290
291
292       val set : control -> unit
293
294
295       set  r  changes  the  GC parameters according to the control record r .
296       The normal usage is: Gc.set { (Gc.get()) with Gc.verbose = 0x00d }
297
298
299
300       Alert unsynchronized_access.  GC parameters are a mutable global state.
301
302
303
304       val minor : unit -> unit
305
306       Trigger a minor collection.
307
308
309
310       val major_slice : int -> int
311
312
313       major_slice n Do a minor collection and a slice of major collection.  n
314       is  the size of the slice: the GC will do enough work to free (on aver‐
315       age) n words of memory. If n = 0, the GC will try to do enough work  to
316       ensure  that the next automatic slice has no work to do.  This function
317       returns an unspecified integer (currently: 0).
318
319
320
321       val major : unit -> unit
322
323       Do a minor collection and finish the current major collection cycle.
324
325
326
327       val full_major : unit -> unit
328
329       Do a minor collection, finish the current major collection  cycle,  and
330       perform a complete new cycle.  This will collect all currently unreach‐
331       able blocks.
332
333
334
335       val compact : unit -> unit
336
337       Perform a full major collection and compact the heap.  Note  that  heap
338       compaction is a lengthy operation.
339
340
341
342       val print_stat : out_channel -> unit
343
344       Print  the  current  values  of  the memory management counters (in hu‐
345       man-readable form) of the total program into the channel argument.
346
347
348
349       val allocated_bytes : unit -> float
350
351       Return the number of bytes allocated by this domain and  potentially  a
352       previous  domain.  It is returned as a float to avoid overflow problems
353       with int on 32-bit machines.
354
355
356
357       val get_minor_free : unit -> int
358
359       Return the current size of the free space inside the minor heap of this
360       domain.
361
362
363       Since 4.03.0
364
365
366
367       val finalise : ('a -> unit) -> 'a -> unit
368
369
370       finalise  f v registers f as a finalisation function for v .  v must be
371       heap-allocated.  f will be called with v as argument at some point  be‐
372       tween  the  first  time  v  becomes unreachable (including through weak
373       pointers) and the time v is collected by the GC. Several functions  can
374       be registered for the same value, or even several instances of the same
375       function.  Each instance will be called once (or never, if the  program
376       terminates before v becomes unreachable).
377
378       The  GC  will call the finalisation functions in the order of dealloca‐
379       tion.  When several values become unreachable at the  same  time  (i.e.
380       during the same GC cycle), the finalisation functions will be called in
381       the reverse order of the corresponding calls to finalise .  If finalise
382       is  called  in  the  same order as the values are allocated, that means
383       each value is finalised before the values it depends upon.  Of  course,
384       this becomes false if additional dependencies are introduced by assign‐
385       ments.
386
387       In the presence of multiple OCaml threads it should be assumed that any
388       particular finaliser may be executed in any of the threads.
389
390       Anything  reachable  from the closure of finalisation functions is con‐
391       sidered reachable, so the following code will not work as expected:
392
393       - let v = ... in Gc.finalise (fun _ -> ...v...) v
394
395       Instead you should make sure that v is not in the closure of the final‐
396       isation function by writing:
397
398       - let f = fun x -> ...  let v = ... in Gc.finalise f v
399
400       The  f  function  can  use all features of OCaml, including assignments
401       that make the value reachable again.  It can also loop forever (in this
402       case,  the  other  finalisation functions will not be called during the
403       execution of f, unless it calls finalise_release ).  It  can  call  fi‐
404       nalise on v or other values to register other functions or even itself.
405       It can raise an exception; in this case the  exception  will  interrupt
406       whatever the program was doing when the function was called.
407
408
409       finalise  will  raise  Invalid_argument  if  v  is not guaranteed to be
410       heap-allocated.  Some examples of values that  are  not  heap-allocated
411       are  integers,  constant  constructors,  booleans, the empty array, the
412       empty list, the unit value.  The exact list of what  is  heap-allocated
413       or  not  is  implementation-dependent.   Some  constant  values  can be
414       heap-allocated but never deallocated during the lifetime  of  the  pro‐
415       gram, for example a list of integer constants; this is also implementa‐
416       tion-dependent.  Note that values of types float  are  sometimes  allo‐
417       cated  and  sometimes  not,  so finalising them is unsafe, and finalise
418       will also raise Invalid_argument for them. Values  of  type  'a  Lazy.t
419       (for  any 'a ) are like float in this respect, except that the compiler
420       sometimes optimizes them in a way that prevents finalise from detecting
421       them. In this case, it will not raise Invalid_argument , but you should
422       still avoid calling finalise on lazy values.
423
424       The results of calling String.make , Bytes.make ,  Bytes.create  ,  Ar‐
425       ray.make , and ref are guaranteed to be heap-allocated and non-constant
426       except when the length argument is 0 .
427
428
429
430       val finalise_last : (unit -> unit) -> 'a -> unit
431
432       same as Gc.finalise except the value is not given as argument.  So  you
433       can't use the given value for the computation of the finalisation func‐
434       tion. The benefit is that the function is called after the value is un‐
435       reachable  for  the last time instead of the first time. So contrary to
436       Gc.finalise the value will never be reachable again or used  again.  In
437       particular  every  weak pointer and ephemeron that contained this value
438       as key or data is unset before running the finalisation function. More‐
439       over  the  finalisation  functions attached with Gc.finalise are always
440       called before the finalisation functions attached with Gc.finalise_last
441       .
442
443
444       Since 4.04
445
446
447
448       val finalise_release : unit -> unit
449
450       A  finalisation  function may call finalise_release to tell the GC that
451       it can launch the next finalisation function without  waiting  for  the
452       current one to return.
453
454
455       type alarm
456
457
458       An  alarm  is  a piece of data that calls a user function at the end of
459       each major GC cycle.  The following functions are  provided  to  create
460       and delete alarms.
461
462
463
464       val create_alarm : (unit -> unit) -> alarm
465
466
467       create_alarm f will arrange for f to be called at the end of each major
468       GC cycle, starting with the current cycle or the next one.  A value  of
469       type alarm is returned that you can use to call delete_alarm .
470
471
472
473       val delete_alarm : alarm -> unit
474
475
476       delete_alarm  a  will  stop the calls to the function associated to a .
477       Calling delete_alarm a again has no effect.
478
479
480
481       val eventlog_pause : unit -> unit
482
483       Deprecated.  Use Runtime_events.pause instead.
484
485
486
487       val eventlog_resume : unit -> unit
488
489       Deprecated.  Use Runtime_events.resume instead.
490
491
492       module Memprof : sig end
493
494
495
496       Memprof is a sampling engine for allocated memory  words.  Every  allo‐
497       cated  word  has a probability of being sampled equal to a configurable
498       sampling rate. Once a block is sampled, it becomes tracked.  A  tracked
499       block triggers a user-defined callback as soon as it is allocated, pro‐
500       moted or deallocated.
501
502       Since blocks are composed of several words, a block can potentially  be
503       sampled  several  times. If a block is sampled several times, then each
504       of the callback is called once for each event of this block: the multi‐
505       plicity is given in the n_samples field of the allocation structure.
506
507       This  engine  makes it possible to implement a low-overhead memory pro‐
508       filer as an OCaml library.
509
510       Note: this API is EXPERIMENTAL. It may change without prior notice.
511
512
513
514
515
516OCamldoc                          2023-07-20                             Gc(3)
Impressum