Модуль Gc.Memprof
module Memprof: sig .. end
Memprof — это движок для выборки выделенных слов памяти. Каждое выделенное слово имеет вероятность быть выбранным, равную настраиваемой частоте выборки. После выборки блока он отслеживается. Отслеживаемый блок запускает определённый пользователем обратный вызов, как только он выделяется, повышается или освобождается.
Поскольку блоки состоят из нескольких слов, блок может быть выбран несколько раз. Если блок выбран несколько раз, то каждый обратный вызов вызывается один раз для каждого события этого блока: кратность указана в поле n_samples структуры allocation.
Этот движок позволяет реализовать профайлер памяти с низкой нагрузкой как библиотеку OCaml.
Примечание: этот API является ЭКСПЕРИМЕНТАЛЬНЫМ. Он может быть изменён без предварительного уведомления.
type allocation_source =
|
| Normal
|
|
| Marshal
|
|
| Custom
|
type allocation = private {
n_samples :
| (* |
Количество выборок в этом блоке (>= 1). |
*) | |
size :
| (* |
Размер блока в словах, за исключением заголовка. |
*) | |
source :
| (* |
Тип выделения. |
*) | |
callstack :
| (* |
Стек вызовов для выделения. |
*) |
} Тип метаданных, связанных с выделениями. Это тип записей, передаваемых в обратный вызов, вызванный выборкой выделения.
type ('minor, 'major) tracker = {
alloc_minor :
| |
alloc_major :
| |
promote :
| |
dealloc_minor :
| |
dealloc_major :
|
} ('minor, 'major) tracker описывает, как memprof должен отслеживать выбранные блоки на протяжении всего их жизненного цикла, сохраняя пользовательские метаданные для каждого из них: 'minor — тип метаданных для мелких блоков, а 'major — тип метаданных для крупных блоков.
При использовании потоков гарантируется, что обратные вызовы выделения всегда выполняются в том потоке, где происходит выделение.
Если функция отслеживания выделения или повышения возвращает None, memprof прекращает отслеживание соответствующего значения.
val null_tracker : ('minor, 'major) tracker
Обратные вызовы по умолчанию просто возвращают None или ()
val start : sampling_rate:float -> ?callstack_size:int -> ('minor, 'major) tracker -> unit
Запустить выборку с заданными параметрами. Возвращает ошибку, если выборка уже активна.
Параметр sampling_rate — частота выборки в выборках на слово (включая заголовки). Обычно, при использовании недорогих обратных вызовов, частота 1e-4 не оказывает заметного влияния на производительность, а частота 1e-3 замедляет выполнение программы примерно на несколько процентов.
Параметр callstack_size — длина стека вызовов, записываемого при каждой выборке. По умолчанию он равен max_int.
Параметр tracker определяет способ отслеживания выбранных блоков на протяжении всего их жизненного цикла в кучах minor и major.
Выборка временно отключается при вызове обратного вызова для текущего потока. Поэтому обратные вызовы не должны быть рекурсивными, если программа однопоточная. Однако, если используются потоки, возможно переключение контекста во время обратного вызова, в этом случае функции обратного вызова должны быть рекурсивными.
Обратите внимание, что обратный вызов может быть немного отложен после фактического события. Стек вызовов, переданный обратному вызову, всегда точен, но состояние программы может измениться.
val stop : unit -> unit
Остановить выборку. Возвращает ошибку, если выборка не активна.
Эта функция не выделяет память.
Все уже отслеживаемые блоки удаляются. Если есть ожидающие отложенные обратные вызовы, они могут быть удалены.
Вызов stop во время работы обратного вызова может привести к тому, что обратные вызовы не будут вызваны, даже если произошли некоторые события.
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/libref/Gc.Memprof.html