sig
  type stat = {
    minor_words : float;
    promoted_words : float;
    major_words : float;
    minor_collections : int;
    major_collections : int;
    heap_words : int;
    heap_chunks : int;
    live_words : int;
    live_blocks : int;
    free_words : int;
    free_blocks : int;
    largest_free : int;
    fragments : int;
    compactions : int;
    top_heap_words : int;
    stack_size : int;
    forced_major_collections : int;
  }
  type control = {
    minor_heap_size : int;
    major_heap_increment : int;
    space_overhead : int;
    verbose : int;
    max_overhead : int;
    stack_limit : int;
    allocation_policy : int;
    window_size : int;
    custom_major_ratio : int;
    custom_minor_ratio : int;
    custom_minor_max_size : int;
  }
  external stat : unit -> Gc.stat = "caml_gc_stat"
  external quick_stat : unit -> Gc.stat = "caml_gc_quick_stat"
  external counters : unit -> float * float * float = "caml_gc_counters"
  external minor_words : unit -> (float [@unboxed]) = "caml_gc_minor_words"
    "caml_gc_minor_words_unboxed"
  external get : unit -> Gc.control = "caml_gc_get"
  external set : Gc.control -> unit = "caml_gc_set"
  external minor : unit -> unit = "caml_gc_minor"
  external major_slice : int -> int = "caml_gc_major_slice"
  external major : unit -> unit = "caml_gc_major"
  external full_major : unit -> unit = "caml_gc_full_major"
  external compact : unit -> unit = "caml_gc_compaction"
  val print_stat : Stdlib.out_channel -> unit
  val allocated_bytes : unit -> float
  external get_minor_free : unit -> int = "caml_get_minor_free"
  val finalise : ('-> unit) -> '-> unit
  val finalise_last : (unit -> unit) -> '-> unit
  val finalise_release : unit -> unit
  type alarm
  val create_alarm : (unit -> unit) -> Gc.alarm
  val delete_alarm : Gc.alarm -> unit
  val eventlog_pause : unit -> unit
  val eventlog_resume : unit -> unit
  module Memprof :
    sig
      type t
      type allocation_source = Normal | Marshal | Custom
      type allocation = private {
        n_samples : int;
        size : int;
        source : Gc.Memprof.allocation_source;
        callstack : Stdlib.Printexc.raw_backtrace;
      }
      type ('minor, 'major) tracker = {
        alloc_minor : Gc.Memprof.allocation -> 'minor option;
        alloc_major : Gc.Memprof.allocation -> 'major option;
        promote : 'minor -> 'major option;
        dealloc_minor : 'minor -> unit;
        dealloc_major : 'major -> unit;
      }
      val null_tracker : ('minor, 'major) Gc.Memprof.tracker
      val start :
        sampling_rate:float ->
        ?callstack_size:int ->
        ('minor, 'major) Gc.Memprof.tracker -> Gc.Memprof.t
      val stop : unit -> unit
      val discard : Gc.Memprof.t -> unit
    end
end