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

NAME

6       Stdlib.Gc - no description
7

Module

9       Module   Stdlib.Gc
10

Documentation

12       Module Gc
13        : (module Stdlib__gc)
14
15
16
17
18
19
20
21       type stat = {
22        minor_words  : float ;  (* Number of words allocated in the minor heap
23       since the program was started.
24        *)
25        promoted_words : float ;  (* Number of words allocated  in  the  minor
26       heap  that survived a minor collection and were moved to the major heap
27       since the program was started.
28        *)
29        major_words : float ;  (* Number of words allocated in the major heap,
30       including the promoted words, since the program was started.
31        *)
32        minor_collections  :  int  ;  (* Number of minor collections since the
33       program was started.
34        *)
35        major_collections : int ;  (* Number of major collection  cycles  com‐
36       pleted since the program was started.
37        *)
38        heap_words : int ;  (* Total size of the major heap, in words.
39        *)
40        heap_chunks  :  int  ;   (* Number of contiguous pieces of memory that
41       make up the major heap.
42        *)
43        live_words : int ;  (* Number of words of live data in the major heap,
44       including the header words.
45        *)
46        live_blocks : int ;  (* Number of live blocks in the major heap.
47        *)
48        free_words : int ;  (* Number of words in the free list.
49        *)
50        free_blocks : int ;  (* Number of blocks in the free list.
51        *)
52        largest_free  :  int ;  (* Size (in words) of the largest block in the
53       free list.
54        *)
55        fragments : int ;  (* Number of wasted  words  due  to  fragmentation.
56       These are 1-words free blocks placed between two live blocks.  They are
57       not available for allocation.
58        *)
59        compactions : int ;  (* Number of heap compactions since  the  program
60       was started.
61        *)
62        top_heap_words  : int ;  (* Maximum size reached by the major heap, in
63       words.
64        *)
65        stack_size : int ;  (* Current size of the stack, in words.
66
67
68       Since 3.12.0
69        *)
70        forced_major_collections : int ;  (* Number of forced full major  col‐
71       lections completed since the program was started.
72
73
74       Since 4.12.0
75        *)
76        }
77
78
79       The memory management counters are returned in a stat record.
80
81       The  total  amount  of  memory  allocated  by  the program since it was
82       started is (in words) minor_words  +  major_words  -  promoted_words  .
83       Multiply  by  the  word  size (4 on a 32-bit machine, 8 on a 64-bit ma‐
84       chine) to get the number of bytes.
85
86
87       type control = {
88
89       mutable minor_heap_size : int ;  (* The size (in words)  of  the  minor
90       heap.   Changing  this  parameter will trigger a minor collection.  De‐
91       fault: 256k.
92        *)
93
94       mutable major_heap_increment : int ;  (* How much to add to  the  major
95       heap  when increasing it. If this number is less than or equal to 1000,
96       it is a percentage of the current heap size (i.e.  setting  it  to  100
97       will  double  the heap size at each increase). If it is more than 1000,
98       it is a fixed number of words that will be added to the heap.  Default:
99       15.
100        *)
101
102       mutable  space_overhead : int ;  (* The major GC speed is computed from
103       this parameter.  This is the memory that will be "wasted"  because  the
104       GC does not immediately collect unreachable blocks.  It is expressed as
105       a percentage of the memory used for live data.  The GC will  work  more
106       (use  more  CPU time and collect blocks more eagerly) if space_overhead
107       is smaller.  Default: 80.
108        *)
109
110       mutable verbose : int ;  (* This value  controls  the  GC  messages  on
111       standard  error output.  It is a sum of some of the following flags, to
112       print messages on the corresponding events:
113
114       - 0x001 Start and end of major GC cycle.
115
116       - 0x002 Minor collection and major GC slice.
117
118       - 0x004 Growing and shrinking of the heap.
119
120       - 0x008 Resizing of stacks and memory manager tables.
121
122       - 0x010 Heap compaction.
123
124       - 0x020 Change of GC parameters.
125
126       - 0x040 Computation of major GC slice size.
127
128       - 0x080 Calling of finalisation functions.
129
130       - 0x100 Bytecode executable and shared library search at start-up.
131
132       - 0x200 Computation of compaction-triggering condition.
133
134       - 0x400 Output GC statistics at program exit.  Default: 0.
135
136        *)
137
138       mutable max_overhead : int ;  (* Heap compaction is triggered when  the
139       estimated  amount  of "wasted" memory is more than max_overhead percent
140       of the amount of live data.  If max_overhead is set  to  0,  heap  com‐
141       paction is triggered at the end of each major GC cycle (this setting is
142       intended for testing purposes only).  If max_overhead >= 1000000 , com‐
143       paction  is never triggered.  If compaction is permanently disabled, it
144       is strongly suggested to set allocation_policy to 2.  Default: 500.
145        *)
146
147       mutable stack_limit : int ;  (* The  maximum  size  of  the  stack  (in
148       words).   This is only relevant to the byte-code runtime, as the native
149       code runtime uses the operating system's stack.  Default: 1024k.
150        *)
151
152       mutable allocation_policy : int ;  (* The policy used for allocating in
153       the major heap.  Possible values are 0, 1 and 2.
154
155
156       -0  is  the  next-fit  policy,  which is usually fast but can result in
157       fragmentation, increasing memory consumption.
158
159
160       -1 is the first-fit policy, which avoids fragmentation but  has  corner
161       cases (in certain realistic workloads) where it is sensibly slower.
162
163
164       -2  is  the best-fit policy, which is fast and avoids fragmentation. In
165       our experiments it is faster and uses less memory  than  both  next-fit
166       and first-fit.  (since OCaml 4.10)
167
168       The  current default is next-fit, as the best-fit policy is new and not
169       yet widely tested. We expect best-fit to become the default in the  fu‐
170       ture.
171
172       On  one  example  that  was known to be bad for next-fit and first-fit,
173       next-fit takes 28s using 855Mio of memory, first-fit  takes  47s  using
174       566Mio of memory, best-fit takes 27s using 545Mio of memory.
175
176       Note: When changing to a low-fragmentation policy, you may need to aug‐
177       ment the space_overhead setting, for example using 100 instead  of  the
178       default 80 which is tuned for next-fit. Indeed, the difference in frag‐
179       mentation behavior means that different policies  will  have  different
180       proportion  of  "wasted  space" for a given program. Less fragmentation
181       means a smaller heap so, for the same amount of wasted space, a  higher
182       proportion  of  wasted space. This makes the GC work harder, unless you
183       relax it by increasing space_overhead .
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: 0.
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.  This function examines every heap block to get the statistics.
247
248
249
250       val quick_stat : unit -> stat
251
252       Same  as  stat  except  that  live_words  ,  live_blocks , free_words ,
253       free_blocks , largest_free , and fragments are set to 0.  This function
254       is  much  faster  than  stat because it does not need to go through the
255       heap.
256
257
258
259       val counters : unit -> float * float * float
260
261       Return (minor_words, promoted_words, major_words) .  This  function  is
262       as fast as quick_stat .
263
264
265
266       val minor_words : unit -> float
267
268       Number  of  words  allocated  in  the  minor heap since the program was
269       started. This number is accurate in byte-code programs, but only an ap‐
270       proximation in programs compiled to native code.
271
272       In native code this function does not allocate.
273
274
275       Since 4.04
276
277
278
279       val get : unit -> control
280
281       Return the current values of the GC parameters in a control record.
282
283
284
285       val set : control -> unit
286
287
288       set  r  changes  the  GC parameters according to the control record r .
289       The normal usage is: Gc.set { (Gc.get()) with Gc.verbose = 0x00d }
290
291
292
293
294       val minor : unit -> unit
295
296       Trigger a minor collection.
297
298
299
300       val major_slice : int -> int
301
302
303       major_slice n Do a minor collection and a slice of major collection.  n
304       is  the size of the slice: the GC will do enough work to free (on aver‐
305       age) n words of memory. If n = 0, the GC will try to do enough work  to
306       ensure  that the next automatic slice has no work to do.  This function
307       returns an unspecified integer (currently: 0).
308
309
310
311       val major : unit -> unit
312
313       Do a minor collection and finish the current major collection cycle.
314
315
316
317       val full_major : unit -> unit
318
319       Do a minor collection, finish the current major collection  cycle,  and
320       perform a complete new cycle.  This will collect all currently unreach‐
321       able blocks.
322
323
324
325       val compact : unit -> unit
326
327       Perform a full major collection and compact the heap.  Note  that  heap
328       compaction is a lengthy operation.
329
330
331
332       val print_stat : out_channel -> unit
333
334       Print  the  current  values  of  the memory management counters (in hu‐
335       man-readable form) into the channel argument.
336
337
338
339       val allocated_bytes : unit -> float
340
341       Return the total number  of  bytes  allocated  since  the  program  was
342       started.  It is returned as a float to avoid overflow problems with int
343       on 32-bit machines.
344
345
346
347       val get_minor_free : unit -> int
348
349       Return the current size of the free space inside the minor heap.
350
351
352       Since 4.03.0
353
354
355
356       val get_bucket : int -> int
357
358
359       get_bucket n returns the current size of the n -th future bucket of the
360       GC smoothing system. The unit is one millionth of a full GC.
361
362
363       Since 4.03.0
364
365
366       Raises  Invalid_argument if n is negative, return 0 if n is larger than
367       the smoothing window.
368
369
370
371       val get_credit : unit -> int
372
373
374       get_credit () returns the current size of the "work  done  in  advance"
375       counter of the GC smoothing system. The unit is one millionth of a full
376       GC.
377
378
379       Since 4.03.0
380
381
382
383       val huge_fallback_count : unit -> int
384
385       Return the number of times we tried to map huge pages and had  to  fall
386       back to small pages. This is always 0 if OCAMLRUNPARAM contains H=1 .
387
388
389       Since 4.03.0
390
391
392
393       val finalise : ('a -> unit) -> 'a -> unit
394
395
396       finalise  f v registers f as a finalisation function for v .  v must be
397       heap-allocated.  f will be called with v as argument at some point  be‐
398       tween  the  first  time  v  becomes unreachable (including through weak
399       pointers) and the time v is collected by the GC. Several functions  can
400       be registered for the same value, or even several instances of the same
401       function.  Each instance will be called once (or never, if the  program
402       terminates before v becomes unreachable).
403
404       The  GC  will call the finalisation functions in the order of dealloca‐
405       tion.  When several values become unreachable at the  same  time  (i.e.
406       during the same GC cycle), the finalisation functions will be called in
407       the reverse order of the corresponding calls to finalise .  If finalise
408       is  called  in  the  same order as the values are allocated, that means
409       each value is finalised before the values it depends upon.  Of  course,
410       this becomes false if additional dependencies are introduced by assign‐
411       ments.
412
413       In the presence of multiple OCaml threads it should be assumed that any
414       particular finaliser may be executed in any of the threads.
415
416       Anything  reachable  from the closure of finalisation functions is con‐
417       sidered reachable, so the following code will not work as expected:
418
419       - let v = ... in Gc.finalise (fun _ -> ...v...) v
420
421       Instead you should make sure that v is not in the closure of the final‐
422       isation function by writing:
423
424       - let f = fun x -> ...  let v = ... in Gc.finalise f v
425
426       The  f  function  can  use all features of OCaml, including assignments
427       that make the value reachable again.  It can also loop forever (in this
428       case,  the  other  finalisation functions will not be called during the
429       execution of f, unless it calls finalise_release ).  It  can  call  fi‐
430       nalise on v or other values to register other functions or even itself.
431       It can raise an exception; in this case the  exception  will  interrupt
432       whatever the program was doing when the function was called.
433
434
435       finalise  will  raise  Invalid_argument  if  v  is not guaranteed to be
436       heap-allocated.  Some examples of values that  are  not  heap-allocated
437       are  integers,  constant  constructors,  booleans, the empty array, the
438       empty list, the unit value.  The exact list of what  is  heap-allocated
439       or  not  is  implementation-dependent.   Some  constant  values  can be
440       heap-allocated but never deallocated during the lifetime  of  the  pro‐
441       gram, for example a list of integer constants; this is also implementa‐
442       tion-dependent.  Note that values of types float  are  sometimes  allo‐
443       cated  and  sometimes  not,  so finalising them is unsafe, and finalise
444       will also raise Invalid_argument for them. Values  of  type  'a  Lazy.t
445       (for  any 'a ) are like float in this respect, except that the compiler
446       sometimes optimizes them in a way that prevents finalise from detecting
447       them. In this case, it will not raise Invalid_argument , but you should
448       still avoid calling finalise on lazy values.
449
450       The results of calling String.make , Bytes.make ,  Bytes.create  ,  Ar‐
451       ray.make , and ref are guaranteed to be heap-allocated and non-constant
452       except when the length argument is 0 .
453
454
455
456       val finalise_last : (unit -> unit) -> 'a -> unit
457
458       same as Gc.finalise except the value is not given as argument.  So  you
459       can't use the given value for the computation of the finalisation func‐
460       tion. The benefit is that the function is called after the value is un‐
461       reachable  for  the last time instead of the first time. So contrary to
462       Gc.finalise the value will never be reachable again or used  again.  In
463       particular  every  weak pointer and ephemeron that contained this value
464       as key or data is unset before running the finalisation function. More‐
465       over  the  finalisation  functions attached with Gc.finalise are always
466       called before the finalisation functions attached with Gc.finalise_last
467       .
468
469
470       Since 4.04
471
472
473
474       val finalise_release : unit -> unit
475
476       A  finalisation  function may call finalise_release to tell the GC that
477       it can launch the next finalisation function without  waiting  for  the
478       current one to return.
479
480
481       type alarm
482
483
484       An  alarm  is  a piece of data that calls a user function at the end of
485       each major GC cycle.  The following functions are  provided  to  create
486       and delete alarms.
487
488
489
490       val create_alarm : (unit -> unit) -> alarm
491
492
493       create_alarm f will arrange for f to be called at the end of each major
494       GC cycle, starting with the current cycle or the next one.  A value  of
495       type alarm is returned that you can use to call delete_alarm .
496
497
498
499       val delete_alarm : alarm -> unit
500
501
502       delete_alarm  a  will  stop the calls to the function associated to a .
503       Calling delete_alarm a again has no effect.
504
505
506
507       val eventlog_pause : unit -> unit
508
509
510       eventlog_pause () will pause the collection of traces in  the  runtime.
511       Traces  are collected if the program is linked to the instrumented run‐
512       time and started with the environment variable  OCAML_EVENTLOG_ENABLED.
513       Events  are  flushed  to  disk after pausing, and no new events will be
514       recorded until eventlog_resume is called.
515
516
517
518       val eventlog_resume : unit -> unit
519
520
521       eventlog_resume () will resume the collection of traces in the runtime.
522       Traces  are collected if the program is linked to the instrumented run‐
523       time and started with the environment variable  OCAML_EVENTLOG_ENABLED.
524       This  call can be used after calling eventlog_pause , or if the program
525       was started with OCAML_EVENTLOG_ENABLED=p. (which pauses the collection
526       of traces before the first event.)
527
528
529       module Memprof : sig end
530
531
532
533       Memprof  is  a  sampling engine for allocated memory words. Every allo‐
534       cated word has a probability of being sampled equal to  a  configurable
535       sampling  rate.  Once a block is sampled, it becomes tracked. A tracked
536       block triggers a user-defined callback as soon as it is allocated, pro‐
537       moted or deallocated.
538
539       Since  blocks are composed of several words, a block can potentially be
540       sampled several times. If a block is sampled several times,  then  each
541       of the callback is called once for each event of this block: the multi‐
542       plicity is given in the n_samples field of the allocation structure.
543
544       This engine makes it possible to implement a low-overhead  memory  pro‐
545       filer as an OCaml library.
546
547       Note: this API is EXPERIMENTAL. It may change without prior notice.
548
549
550
551
552
553OCamldoc                          2021-07-22                      Stdlib.Gc(3)
Impressum