V8
Исходный код: lib/v8.js
Модуль v8 предоставляет API, специфичные для версии V8, встроенной в бинарник Node.js. К нему можно получить доступ следующим образом:
const v8 = require('v8');
v8.cachedDataVersionTag()
- Возвращает: <целое число>
Возвращает целое число, представляющее тег версии, полученный из версии V8, флагов командной строки и обнаруженных особенностей процессора. Это полезно для определения совместимости буфера vm.Script cachedData с этим экземпляром V8.
console.log(v8.cachedDataVersionTag()); // 3947234607
// The value returned by v8.cachedDataVersionTag() is derived from the V8
// version, command-line flags, and detected CPU features. Test that the value
// does indeed update when flags are toggled.
v8.setFlagsFromString('--allow_natives_syntax');
console.log(v8.cachedDataVersionTag()); // 183726201
v8.getHeapCodeStatistics()
- Возвращает: <объект>
Возвращает объект со следующими свойствами:
-
code_and_metadata_size<число> -
bytecode_and_metadata_size<число> -
external_script_source_size<число>
{
code_and_metadata_size: 212208,
bytecode_and_metadata_size: 161368,
external_script_source_size: 1410794
}
v8.getHeapSnapshot()
- Возвращает: <поток.Чтение> Поток чтения, содержащий дамп кучи V8
Создаёт дамп текущей кучи V8 и возвращает поток чтения, который можно использовать для чтения сериализованного представления в формате JSON. Этот формат JSON предназначен для использования с такими инструментами, как Chrome DevTools. Схема JSON не документирована и специфична для движка V8. Поэтому она может изменяться от одной версии V8 к другой.
// Print heap snapshot to the console
const v8 = require('v8');
const stream = v8.getHeapSnapshot();
stream.pipe(process.stdout);
v8.getHeapSpaceStatistics()
- Возвращает: <Массив объектов>
Возвращает статистику о пространствах кучи V8, т.е. сегментах, из которых состоит куча V8. Порядок пространств кучи и их доступность не гарантируются, так как статистика предоставляется через функцию V8 GetHeapSpaceStatistics и может изменяться от одной версии V8 к другой.
Возвращаемое значение — массив объектов, содержащих следующие свойства:
-
space_name<строка> -
space_size<число> -
space_used_size<число> -
space_available_size<число> -
physical_space_size<число>
[
{
"space_name": "new_space",
"space_size": 2063872,
"space_used_size": 951112,
"space_available_size": 80824,
"physical_space_size": 2063872
},
{
"space_name": "old_space",
"space_size": 3090560,
"space_used_size": 2493792,
"space_available_size": 0,
"physical_space_size": 3090560
},
{
"space_name": "code_space",
"space_size": 1260160,
"space_used_size": 644256,
"space_available_size": 960,
"physical_space_size": 1260160
},
{
"space_name": "map_space",
"space_size": 1094160,
"space_used_size": 201608,
"space_available_size": 0,
"physical_space_size": 1094160
},
{
"space_name": "large_object_space",
"space_size": 0,
"space_used_size": 0,
"space_available_size": 1490980608,
"physical_space_size": 0
}
]
v8.getHeapStatistics()
- Возвращает: <объект>
Возвращает объект со следующими свойствами:
-
total_heap_size<число> -
total_heap_size_executable<число> -
total_physical_size<число> -
total_available_size<число> -
used_heap_size<число> -
heap_size_limit<число> -
malloced_memory<число> -
peak_malloced_memory<число> -
does_zap_garbage<число> -
number_of_native_contexts<число> -
number_of_detached_contexts<число>
does_zap_garbage — логическое значение (0 или 1), указывающее, включён ли параметр --zap_code_space. Это заставляет V8 перезаписывать мусор кучи битовым шаблоном. След от резидентного набора (RSS) увеличивается, так как он постоянно обращается ко всем страницам кучи, что делает их менее подверженными вытеснению операционной системой.
number_of_native_contexts Значение native_context — количество активных контекстов верхнего уровня. Увеличение этого значения со временем указывает на утечку памяти.
number_of_detached_contexts Значение detached_context — количество контекстов, которые были отделены и ещё не собраны сборщиком мусора. Значение, отличное от нуля, указывает на потенциальную утечку памяти.
{
total_heap_size: 7326976,
total_heap_size_executable: 4194304,
total_physical_size: 7326976,
total_available_size: 1152656,
used_heap_size: 3476208,
heap_size_limit: 1535115264,
malloced_memory: 16384,
peak_malloced_memory: 1127496,
does_zap_garbage: 0,
number_of_native_contexts: 1,
number_of_detached_contexts: 0
}
v8.setFlagsFromString(flags)
-
flags<строка>
Метод v8.setFlagsFromString() позволяет программно задавать флаги командной строки V8. К этому методу следует подходить с осторожностью. Изменение настроек после запуска виртуальной машины может привести к непредсказуемому поведению, включая сбои и потерю данных; или же это вообще может ничего не изменить.
Доступные для версии Node.js параметры V8 можно определить, выполнив node --v8-options.
Использование:
// Print GC events to stdout for one minute.
const v8 = require('v8');
v8.setFlagsFromString('--trace_gc');
setTimeout(() => { v8.setFlagsFromString('--notrace_gc'); }, 60e3);
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])
-
filename<строка> Путь к файлу, в который будет сохранён дамп кучи V8. Если не указано, будет сгенерировано имя файла с шаблоном'Heap-${yyyymmdd}-${hhmmss}-${pid}-${thread_id}.heapsnapshot', где{pid}— идентификатор процесса Node.js,{thread_id}—0, когдаwriteHeapSnapshot()вызывается из основного потока Node.js, или идентификатор потока-работника. - Возвращает: <строка> Имя файла, в который был сохранён дамп.
Создаёт дамп текущей кучи V8 и записывает его в файл JSON. Этот файл предназначен для использования с такими инструментами, как Chrome DevTools. Схема JSON не документирована и специфична для движка V8, и может изменяться от одной версии V8 к другой.
Дамп кучи относится к одному изолированному V8. При использовании потоков-работников дамп кучи, созданный из основного потока, не будет содержать никакой информации о потоках-работниках, и наоборот.
const { writeHeapSnapshot } = require('v8');
const {
Worker,
isMainThread,
parentPort
} = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.once('message', (filename) => {
console.log(`worker heapdump: ${filename}`);
// Now get a heapdump for the main thread.
console.log(`main thread heapdump: ${writeHeapSnapshot()}`);
});
// Tell the worker to create a heapdump.
worker.postMessage('heapdump');
} else {
parentPort.once('message', (message) => {
if (message === 'heapdump') {
// Generate a heapdump for the worker
// and return the filename to the parent.
parentPort.postMessage(writeHeapSnapshot());
}
});
} API сериализации
API сериализации предоставляет средства сериализации значений JavaScript таким образом, чтобы они были совместимы с алгоритмом структурированного клонирования HTML.
Формат обратной совместимости (т.е. безопасен для хранения на диске). Равные значения JavaScript могут привести к различному сериализованному выводу.
v8.serialize(value)
Использует DefaultSerializer для сериализации value в буфер.
ERR_BUFFER_TOO_LARGE будет выброшен при попытке сериализации большого объекта, требующего буфер, больший, чем buffer.constants.MAX_LENGTH.
v8.deserialize(buffer)
-
buffer<Буфер> | <Тип массива> | <DataView> Буфер, возвращённыйserialize().
Использует DefaultDeserializer с параметрами по умолчанию для чтения значения JS из буфера.
Класс: v8.Serializer
new Serializer()
Создаёт новый объект Serializer.
serializer.writeHeader()
Записывает заголовок, включающий версию формата сериализации.
serializer.writeValue(value)
-
value<любой>
Сериализует значение JavaScript и добавляет сериализованное представление во внутренний буфер.
Бросает ошибку, если value не может быть сериализован.
serializer.releaseBuffer()
- Возвращает: <Буфер>
Возвращает хранимый внутренний буфер. Этот сериализатор не должен использоваться после освобождения буфера. Вызов этого метода приводит к неопределённому поведению, если предыдущий запис был неудачным.
serializer.transferArrayBuffer(id, arrayBuffer)
-
id<целое без знака 32 бит> A 32-битное беззнаковое целое. -
arrayBuffer<ArrayBuffer> ЭкземплярArrayBuffer.
Помечает ArrayBuffer как содержащий данные, передаваемые вне основной области. Передайте соответствующий ArrayBuffer в контексте десериализации в deserializer.transferArrayBuffer().
serializer.writeUint32(value)
-
value<целое число>
Записывает 32-битное беззнаковое целое число. Для использования внутри пользовательского serializer._writeHostObject().
serializer.writeUint64(hi, lo)
-
hi<целое число> -
lo<целое число>
Записывает 64-битное беззнаковое целое число, разделенное на две 32-битные части. Для использования внутри пользовательского serializer._writeHostObject().
serializer.writeDouble(value)
-
value<число>
Записывает значение JS number. Для использования внутри пользовательского serializer._writeHostObject().
serializer.writeRawBytes(buffer)
-
buffer<Буфер> | <Тип массива> | <DataView>
Записывает сырые байты во внутренний буфер сериализатора. Десериализатор потребует способ вычисления длины буфера. Для использования внутри пользовательского serializer._writeHostObject().
serializer._writeHostObject(object)
-
object<Объект>
Этот метод вызывается для записи какого-либо объекта хоста, например, объекта, созданного нативными C++ связями. Если сериализация object невозможна, должна быть выброшена соответствующая ошибка.
Этот метод отсутствует в классе Serializer, но может быть предоставлен подклассами.
serializer._getDataCloneError(message)
-
message<строка>
Этот метод вызывается для создания объектов ошибок, которые будут выброшены, когда объект не может быть скопирован.
Этот метод по умолчанию использует конструктор Error и может быть переопределен в подклассах.
serializer._getSharedArrayBufferId(sharedArrayBuffer)
-
sharedArrayBuffer<SharedArrayBuffer>
Этот метод вызывается, когда сериализатор собирается сериализовать объект SharedArrayBuffer. Он должен вернуть 32-битное беззнаковое целочисленное ID объекта, используя то же самое ID, если этот SharedArrayBuffer уже был сериализован. При десериализации это ID будет передано в deserializer.transferArrayBuffer().
Если объект не может быть сериализован, должно быть выброшено исключение.
Этот метод отсутствует в классе Serializer, но может быть предоставлен подклассами.
serializer._setTreatArrayBufferViewsAsHostObjects(flag)
-
flag<логическое значение> По умолчанию:false
Указывает, следует ли рассматривать объекты TypedArray и DataView как объекты хоста, т.е. передавать их в serializer._writeHostObject().
Класс: v8.Deserializer
new Deserializer(buffer)
-
buffer<Буфер> | <Тип массива> | <DataView> Буфер, возвращенныйserializer.releaseBuffer().
Создаёт новый объект Deserializer.
deserializer.readHeader()
Читает и проверяет заголовок (включая версию формата). Может, например, отклонить неверный или неподдерживаемый формат данных. В этом случае выбрасывается Error.
deserializer.readValue()
Десериализует значение JavaScript из буфера и возвращает его.
deserializer.transferArrayBuffer(id, arrayBuffer)
-
id<целое без знака 32 бит> A 32-битное беззнаковое целое. -
arrayBuffer<ArrayBuffer> | <SharedArrayBuffer> ЭкземплярArrayBuffer.
Помечает ArrayBuffer как содержащий данные, передаваемые вне основной области. Передайте соответствующий ArrayBuffer в контексте сериализации в serializer.transferArrayBuffer() (или верните id от serializer._getSharedArrayBufferId() в случае SharedArrayBuffer).
deserializer.getWireFormatVersion()
- Возвращает: <целое число>
Читает версию базового формата данных. Вероятно, будет полезна в основном для устаревшего кода, читающего старые версии формата данных. Может не быть вызван до .readHeader().
deserializer.readUint32()
- Возвращает: <целое число>
Считывает и возвращает 32-битное беззнаковое целое число. Для использования внутри пользовательского deserializer._readHostObject().
deserializer.readUint64()
- Возвращает: <массив целых>
Считывает и возвращает 64-битное беззнаковое целое число как массив [hi, lo] с двумя 32-битными беззнаковыми целочисленными записями. Для использования внутри пользовательского deserializer._readHostObject().
deserializer.readDouble()
- Возвращает: <число>
Считывает значение JS number. Для использования внутри пользовательского deserializer._readHostObject().
deserializer.readRawBytes(length)
Считывает сырые байты из внутреннего буфера десериализатора. Параметр length должен соответствовать длине буфера, переданного в serializer.writeRawBytes(). Для использования внутри пользовательского deserializer._readHostObject().
deserializer._readHostObject()
Этот метод вызывается для считывания некоторого типа объекта хоста, т.е. объекта, созданного нативным C++ связыванием. Если десериализация данных невозможна, должно быть выброшено соответствующее исключение.
Этот метод отсутствует в классе Deserializer сам по себе, но может быть предоставлен подклассами.
Класс: v8.DefaultSerializer
Подкласс Serializer, который сериализует TypedArray (в частности, Buffer) и DataView объекты как объекты хоста и хранит только часть их базовых ArrayBuffer , на которые они ссылаются.
Класс: v8.DefaultDeserializer
Подкласс Deserializer, соответствующий формату, записанному в DefaultSerializer.
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v16.x/docs/api/v8.html