V8¶
Модуль node:v8 предоставляет API, специфичные для версии V8, встроенной в бинарник Node.js. Обратиться к нему можно так:
1 | |
1 | |
v8.cachedDataVersionTag()¶
- Возвращает:
<integer>
Возвращает целое число — тег версии, выведенный из версии V8, флагов командной строки и возможностей CPU. Позволяет проверить, совместим ли буфер cachedData у vm.Script с текущим экземпляром V8.
1 2 3 4 5 | |
v8.getHeapCodeStatistics()¶
- Возвращает:
<Object>
Статистика по коду и метаданным в куче; см. API V8 GetHeapCodeAndMetadataStatistics. Объект со свойствами:
code_and_metadata_size<number>bytecode_and_metadata_size<number>external_script_source_size<number>cpu_profiler_metadata_size<number>
1 2 3 4 5 6 | |
v8.getHeapSnapshot([options])¶
Добавлено в: v11.13.0
options<Object>exposeInternals<boolean>Если true, включать внутренности в снимок кучи. По умолчанию:false.-
exposeNumericValues<boolean>Если true, показывать числа в искусственных полях. По умолчанию:false. -
Возвращает:
<stream.Readable>Поток Readable со снимком кучи V8.
Строит снимок текущей кучи V8 и возвращает Readable для чтения JSON-представления. Формат рассчитан на инструменты вроде Chrome DevTools. Схема JSON недокументирована и зависит от V8 и может меняться между версиями.
Памяти нужно примерно вдвое больше размера кучи на момент снимка; возможно завершение процесса OOM killer.
Операция синхронная и блокирует цикл событий на время, зависящее от размера кучи.
1 2 3 4 5 | |
1 2 3 4 5 | |
v8.getHeapSpaceStatistics()¶
Добавлено в: v6.0.0
- Возвращает:
<Object[]>
Статистика по пространствам кучи V8 (сегменты, из которых она состоит). Порядок пространств и их набор не гарантируются: данные приходят из GetHeapSpaceStatistics и могут меняться между версиями V8.
Массив объектов со свойствами:
space_name<string>space_size<number>space_used_size<number>space_available_size<number>physical_space_size<number>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | |
v8.getHeapStatistics()¶
Добавлено в: v1.0.0
- Возвращает:
<Object>
Объект со свойствами:
total_heap_size<number>total_heap_size_executable<number>total_physical_size<number>total_available_size<number>used_heap_size<number>heap_size_limit<number>malloced_memory<number>peak_malloced_memory<number>does_zap_garbage<number>number_of_native_contexts<number>number_of_detached_contexts<number>total_global_handles_size<number>used_global_handles_size<number>external_memory<number>total_allocated_bytes<number>
total_heap_size — байты, выделенные V8 под кучу; может расти при необходимости.
total_heap_size_executable — часть кучи с исполняемым кодом (JIT и т.п.), в байтах.
total_physical_size — физически занятая память кучи V8 (закоммиченная), в байтах.
total_available_size — сколько байт ещё доступно куче V8 до лимита.
used_heap_size — байты, занятые объектами JavaScript в куче (фактически используемые).
heap_size_limit — максимальный размер кучи V8 в байтах (по умолчанию, ресурсам системы или --max_old_space_size).
malloced_memory — байты, выделенные через malloc в V8.
peak_malloced_memory — пик выделений через malloc за время процесса.
does_zap_garbage — 0/1: включён ли --zap_code_space (затирать освобождённую память шаблоном; RSS растёт, страницы реже вытесняются ОС).
number_of_native_contexts — число активных контекстов верхнего уровня; рост во времени может указывать на утечку.
number_of_detached_contexts — отсоединённые контексты, ещё не собранные GC; ненулевое значение — возможная утечка.
total_global_handles_size — общий объём памяти глобальных дескрипторов V8.
used_global_handles_size — использованный объём глобальных дескрипторов.
external_memory — память под ArrayBuffer и внешние строки.
total_allocated_bytes — всего байт выделено с создания Isolate.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
v8.getCppHeapStatistics([detailLevel])¶
Возвращает статистику CppHeap по памяти через V8 CollectStatistics(); формат может меняться между версиями V8.
detailLevel<string>| undefined: По умолчанию:'detailed'. Уровень детализации:'brief'— только суммарные выделенная и используемая память по всей куче.'detailed'— разбивка по пространствам и страницам, freelist и гистограммы типов.
Структура близка к cppgc::HeapStatistics; подробности — в документации V8.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | |
1 2 3 4 5 6 7 8 9 | |
v8.queryObjects(ctor[, options])¶
ctor<Function>Конструктор для поиска по цепочке прототипов среди объектов в куче.optionsundefined |<Object>format<string>'count'— число найденных объектов;'summary'— массив кратких строковых описаний.- Возвращает:
<number>|<Array<string>>
Аналог queryObjects() console API в консоли Chromium DevTools. После полного GC ищет объекты с подходящим конструктором в цепочке прототипов — удобно для регрессионных тестов на утечки. Не вызывайте для конструкторов, реализацию которых вы не контролируете.
Сырые ссылки на объекты не возвращаются. По умолчанию — только счётчик; при options.format === 'summary' — массив кратких представлений. Видимость сопоставима со снимком кучи, но без полной сериализации.
Учитываются только объекты текущего контекста выполнения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
v8.setFlagsFromString(flags)¶
flags<string>
v8.setFlagsFromString() задаёт флаги V8 из программы. Менять настройки после старта VM опасно: возможны сбои и потеря данных или отсутствие эффекта.
Список опций V8 для вашей сборки: node --v8-options.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
v8.stopCoverage()¶
v8.stopCoverage() останавливает сбор покрытия, запущенный NODE_V8_COVERAGE, чтобы V8 освободил счётчики и мог оптимизировать код. Сочетается с v8.takeCoverage() при сборе покрытия по запросу.
v8.takeCoverage()¶
v8.takeCoverage() записывает на диск покрытие, начатое NODE_V8_COVERAGE, по запросу. Метод можно вызывать многократно: каждый раз счётчик сбрасывается и пишется новый отчёт в каталог из NODE_V8_COVERAGE.
При завершении процесса последний отчёт всё равно запишется, если до выхода не вызвали v8.stopCoverage().
v8.writeHeapSnapshot([filename[,options]])¶
Добавлено в: v11.13.0
filename<string>Путь к файлу для сохранения снимка кучи V8. Если не задан, имя генерируется по шаблону'Heap-${yyyymmdd}-${hhmmss}-${pid}-${thread_id}.heapsnapshot', где{pid}— PID процесса Node.js,{thread_id}—0для главного потока или id воркера.options<Object>exposeInternals<boolean>Если true, включать внутренности в снимок. По умолчанию:false.exposeNumericValues<boolean>Если true, показывать числа в искусственных полях. По умолчанию:false.- Возвращает:
<string>Путь к сохранённому файлу.
Строит снимок текущей кучи V8 и записывает JSON для инструментов вроде Chrome DevTools. Схема недокументирована и зависит от версии V8.
Снимок относится к одному isolate. При worker threads снимок с главного потока не включает воркеры и наоборот.
Нужно примерно вдвое больше памяти, чем размер кучи; возможен OOM killer.
Операция синхронная и блокирует цикл событий.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
v8.setHeapSnapshotNearHeapLimit(limit)¶
limit<integer>
Ничего не делает, если --heapsnapshot-near-heap-limit уже задан в CLI или API вызван повторно. limit — положительное целое. Подробнее: --heapsnapshot-near-heap-limit.
API сериализации¶
Сериализация значений JavaScript, совместимая с HTML structured clone algorithm.
Формат обратно совместим (пригоден для записи на диск). Равные значения JS могут дать разный поток байт.
v8.serialize(value)¶
Использует DefaultSerializer для сериализации value в буфер.
ERR_BUFFER_TOO_LARGE, если объект слишком велик для буфера больше buffer.constants.MAX_LENGTH.
v8.deserialize(buffer)¶
buffer<Buffer>|<TypedArray>|<DataView>Буфер изserialize().
Читает значение JS через DefaultDeserializer с настройками по умолчанию.
Класс: v8.Serializer¶
new Serializer()¶
Создаёт Serializer.
serializer.writeHeader()¶
Записывает заголовок с версией формата сериализации.
serializer.writeValue(value)¶
value<any>
Сериализует значение и добавляет байты во внутренний буфер.
При невозможности сериализации — ошибка.
serializer.releaseBuffer()¶
- Возвращает:
<Buffer>
Возвращает внутренний буфер; после вызова Serializer использовать нельзя. Доопределённое поведение при ошибке предыдущей записи.
serializer.transferArrayBuffer(id, arrayBuffer)¶
id<integer>32-битное беззнаковое целое.arrayBuffer<ArrayBuffer>ЭкземплярArrayBuffer.
Помечает ArrayBuffer для передачи вне потока. В контексте десериализации передайте ArrayBuffer в deserializer.transferArrayBuffer().
serializer.writeUint32(value)¶
value<integer>
Сырые 32 бита без знака. Для кастомного serializer._writeHostObject().
serializer.writeUint64(hi, lo)¶
Сырые 64 бита (старшие и младшие 32 бита). Для serializer._writeHostObject().
serializer.writeDouble(value)¶
value<number>
Значение JS number. Для serializer._writeHostObject().
serializer.writeRawBytes(buffer)¶
buffer<Buffer>|<TypedArray>|<DataView>
Сырые байты во внутренний буфер; при десериализации нужна согласованная длина. Для serializer._writeHostObject().
serializer._writeHostObject(object)¶
object<Object>
Вызывается для «хостового» объекта из нативных привязок C++. Если сериализовать нельзя — подходящее исключение.
В базовом классе отсутствует; можно переопределить в подклассе.
serializer._getDataCloneError(message)¶
message<string>
Формирует объект ошибки при невозможности клонирования.
По умолчанию Error; можно переопределить в подклассе.
serializer._getSharedArrayBufferId(sharedArrayBuffer)¶
sharedArrayBuffer<SharedArrayBuffer>
Вызывается при сериализации SharedArrayBuffer. Должен вернуть 32-битный беззнаковый id; один и тот же id для уже сериализованного буфера. При десериализации id уйдёт в deserializer.transferArrayBuffer().
Если нельзя сериализовать — исключение.
В базовом классе отсутствует; можно задать в подклассе.
serializer._setTreatArrayBufferViewsAsHostObjects(flag)¶
flag<boolean>По умолчанию:false
Считать TypedArray и DataView хостовыми объектами и передавать в serializer._writeHostObject().
Класс: v8.Deserializer¶
new Deserializer(buffer)¶
buffer<Buffer>|<TypedArray>|<DataView>Буфер изserializer.releaseBuffer().
Создаёт Deserializer.
deserializer.readHeader()¶
Читает и проверяет заголовок (версию формата). Неподдерживаемый формат — Error.
deserializer.readValue()¶
Десериализует значение из буфера.
deserializer.transferArrayBuffer(id, arrayBuffer)¶
id<integer>32-битное беззнаковое целое.arrayBuffer<ArrayBuffer>|<SharedArrayBuffer>ЭкземплярArrayBuffer.
Помечает ArrayBuffer для передачи вне потока. В контексте сериализации используйте serializer.transferArrayBuffer() или id из serializer._getSharedArrayBufferId() для SharedArrayBuffer.
deserializer.getWireFormatVersion()¶
- Возвращает:
<integer>
Версия формата wire. Полезно для старого кода. Не вызывать до .readHeader().
deserializer.readUint32()¶
- Возвращает:
<integer>
Сырые 32 бита без знака. Для deserializer._readHostObject().
deserializer.readUint64()¶
- Возвращает:
<integer[]>
Сырые 64 бита как [hi, lo]. Для deserializer._readHostObject().
deserializer.readDouble()¶
- Возвращает:
<number>
Значение JS number. Для deserializer._readHostObject().
deserializer.readRawBytes(length)¶
Сырые байты; length должен совпадать с serializer.writeRawBytes(). Для deserializer._readHostObject().
deserializer._readHostObject()¶
Читает хостовый объект из нативных привязок. При ошибке — исключение.
В базовом классе отсутствует; задаётся в подклассе.
Класс: v8.DefaultSerializer¶
Подкласс Serializer: сериализует TypedArray (в т.ч. Buffer) и DataView как хостовые объекты и сохраняет только используемый фрагмент ArrayBuffer.
Класс: v8.DefaultDeserializer¶
Подкласс Deserializer для формата DefaultSerializer.
Хуки промисов¶
Интерфейс promiseHooks отслеживает жизненный цикл промисов. Для всей асинхронной активности см. async_hooks (внутри использует этот модуль). Для контекста запросов см. AsyncLocalStorage.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | |
promiseHooks.onInit(init)¶
init<Function>Колбэкinitcallback при создании промиса.- Возвращает:
<Function>Функция для отключения хука.
init должен быть обычной функцией; async нельзя — бесконечный цикл микрозадач.
1 2 3 | |
1 2 3 | |
promiseHooks.onSettled(settled)¶
settled<Function>Колбэкsettledcallback при выполнении или отклонении.- Возвращает:
<Function>Функция для отключения хука.
settled должен быть обычной функцией; async нельзя — бесконечный цикл микрозадач.
1 2 3 | |
1 2 3 | |
promiseHooks.onBefore(before)¶
before<Function>Колбэкbeforecallback до выполнения продолжения промиса.- Возвращает:
<Function>Функция для отключения хука.
before должен быть обычной функцией; async нельзя — бесконечный цикл микрозадач.
1 2 3 | |
1 2 3 | |
promiseHooks.onAfter(after)¶
after<Function>Колбэкaftercallback после выполнения продолжения промиса.- Возвращает:
<Function>Функция для отключения хука.
after должен быть обычной функцией; async нельзя — бесконечный цикл микрозадач.
1 2 3 | |
1 2 3 | |
promiseHooks.createHook(callbacks)¶
callbacks<Object>Колбэки хуков для регистрацииinit<Function>initcallback.before<Function>beforecallback.after<Function>aftercallback.settled<Function>settledcallback.- Возвращает:
<Function>Отключение хуков
Все колбэки — обычные функции; async запрещён (бесконечный цикл микрозадач).
Регистрирует обработчики событий жизненного цикла промисов.
Колбэки init/before/after/settled вызываются для соответствующих этапов.
Все поля необязательны: например, для отслеживания только создания достаточно init. Подробности — в разделе Колбэки хуков.
1 2 3 4 5 | |
1 2 3 4 5 | |
Колбэки хуков¶
События жизни промиса делятся на четыре группы: создание, до/после продолжения или вокруг await, завершение (resolve/reject).
В отличие от async_hooks здесь нет destroy: у сокетов есть «закрыто», у промисов — пока на них ссылается код. Для модели async_hooks используется отслеживание через GC, оно дорогое и сборка может не произойти.
Колбэки init/before/after/settled не должны быть async — иначе бесконечный цикл промисов.
Порядок событий относительно async_hooks не определён.
init(promise, parent)¶
Вызывается при создании промиса. Не гарантирует последующие before/after — только возможность; так бывает, если продолжений не было.
before(promise)¶
promise<Promise>
Перед выполнением продолжения: then/catch/finally или возобновление await.
before может быть от 0 до N раз: 0, если продолжений не было; много раз при нескольких цепочках от одного промиса.
after(promise)¶
promise<Promise>
Сразу после продолжения: обработчик then/catch/finally или перед следующим await.
settled(promise)¶
promise<Promise>
Когда получено значение или отказ; может быть синхронно у Promise.resolve()/reject().
API снимка запуска¶
Интерфейс v8.startupSnapshot задаёт хуки сериализации/десериализации для пользовательских снимков запуска.
1 2 3 | |
В entry.js методы v8.startupSnapshot описывают, как сохранять данные пользовательских объектов в снимке и как восстанавливать их при загрузке. Например, скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | |
Получившийся бинарник при запуске выведет данные, десериализованные из снимка, используя обновлённые process.env и process.argv запущенного процесса:
1 2 | |
Сейчас приложение, десериализованное из пользовательского снимка, нельзя снова сериализовать в снимок, поэтому эти API доступны только приложениям, которые не были десериализованы из пользовательского снимка.
v8.startupSnapshot.addSerializeCallback(callback[, data])¶
callback<Function>Колбэк, вызываемый перед сериализацией.data<any>Необязательные данные, передаваемые вcallbackпри вызове.
Добавляет колбэк, который будет вызван, когда экземпляр Node.js собирается сериализоваться в снимок и завершиться. Можно использовать для освобождения ресурсов, которые не следует или нельзя сериализовать, либо для приведения пользовательских данных к виду, удобному для сериализации.
Колбэки выполняются в порядке добавления.
v8.startupSnapshot.addDeserializeCallback(callback[, data])¶
callback<Function>Колбэк, вызываемый после десериализации снимка.data<any>Необязательные данные, передаваемые вcallbackпри вызове.
Добавляет колбэк, который будет вызван, когда экземпляр Node.js десериализуется из снимка. callback и data (если заданы) попадут в снимок; их можно использовать для повторной инициализации состояния приложения или повторного получения ресурсов, нужных при перезапуске из снимка.
Колбэки выполняются в порядке добавления.
v8.startupSnapshot.setDeserializeMainFunction(callback[, data])¶
callback<Function>Колбэк точки входа после десериализации снимка.data<any>Необязательные данные, передаваемые вcallbackпри вызове.
Задаёт точку входа приложения Node.js при десериализации из снимка. Можно вызвать только один раз в скрипте сборки снимка. Если вызван, десериализованному приложению не нужен отдельный скрипт точки входа — будет вызван колбэк вместе с десериализованными данными (если заданы); иначе десериализованному приложению по-прежнему нужно передать скрипт точки входа.
v8.startupSnapshot.isBuildingSnapshot()¶
- Возвращает:
<boolean>
Возвращает true, если экземпляр Node.js запущен для сборки снимка.
Класс: v8.GCProfiler¶
Этот API собирает данные о GC в текущем потоке.
new v8.GCProfiler()¶
Создаёт новый экземпляр класса v8.GCProfiler. Этот API поддерживает синтаксис using.
profiler.start()¶
Начинает сбор данных о GC.
profiler.stop()¶
Останавливает сбор данных о GC и возвращает объект. Содержимое объекта приведено ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | |
Пример:
1 2 3 4 5 6 | |
1 2 3 4 5 6 | |
profiler[Symbol.dispose]()¶
Останавливает сбор данных о GC и отбрасывает профиль.
Класс: SyncCPUProfileHandle¶
syncCpuProfileHandle.stop()¶
- Возвращает:
<string>
Останавливает сбор профиля и возвращает данные профиля.
syncCpuProfileHandle[Symbol.dispose]()¶
Останавливает сбор профиля; профиль будет отброшен.
Класс: SyncHeapProfileHandle¶
Стабильность: 1 – Экспериментальная
syncHeapProfileHandle.stop()¶
- Возвращает:
<string>
Останавливает сбор профиля и возвращает данные профиля.
syncHeapProfileHandle[Symbol.dispose]()¶
Останавливает сбор профиля; профиль будет отброшен.
Класс: CPUProfileHandle¶
cpuProfileHandle.stop()¶
- Возвращает:
<Promise>
Останавливает сбор профиля и возвращает Promise, который разрешается данными профиля или отклоняется с ошибкой.
cpuProfileHandle[Symbol.asyncDispose]()¶
- Возвращает:
<Promise>
Останавливает сбор профиля; профиль будет отброшен.
Класс: HeapProfileHandle¶
heapProfileHandle.stop()¶
- Возвращает:
<Promise>
Останавливает сбор профиля и возвращает Promise, который разрешается данными профиля или отклоняется с ошибкой.
heapProfileHandle[Symbol.asyncDispose]()¶
- Возвращает:
<Promise>
Останавливает сбор профиля; профиль будет отброшен.
v8.isStringOneByteRepresentation(content)¶
V8 поддерживает только Latin-1/ISO-8859-1 и UTF16 как внутреннее представление строки. Если у content внутреннее представление — Latin-1/ISO-8859-1, функция вернёт true; иначе — false.
Если метод возвращает false, это не значит, что в строке есть символы вне Latin-1/ISO-8859-1. Иногда строка Latin-1 может храниться как UTF16.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
v8.startCpuProfile()¶
- Возвращает:
<SyncCPUProfileHandle>
Запускает профилирование CPU и возвращает объект SyncCPUProfileHandle. Этот API поддерживает синтаксис using.
1 2 3 | |
v8.startHeapProfile([options])¶
options<Object>sampleInterval<number>Средний интервал выборки в байтах. По умолчанию:524288(512 KiB).stackDepth<integer>Максимальная глубина стека для выборок. По умолчанию:16.forceGC<boolean>Принудительно запустить сборку мусора перед снятием профиля. По умолчанию:false.includeObjectsCollectedByMajorGC<boolean>Включать объекты, собранные major GC. По умолчанию:false.includeObjectsCollectedByMinorGC<boolean>Включать объекты, собранные minor GC. По умолчанию:false.- Возвращает:
<SyncHeapProfileHandle>
Запускает профилирование кучи и возвращает объект SyncHeapProfileHandle. Этот API поддерживает синтаксис using.
1 2 3 4 5 | |
1 2 3 4 5 | |
С пользовательскими параметрами:
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 | |