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 (resident set size), поскольку V8 постоянно взаимодействует со всеми страницами кучи, что снижает вероятность их вытеснения операционной системой.
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.writeHeapSnapshot([filename])
-
filename<строка> Путь к файлу, в который будет сохранён снимок кучи V8. Если не указано, будет сгенерировано имя файла с шаблоном'Heap-${yyyymmdd}-${hhmmss}-${pid}-${thread_id}.heapsnapshot', где{pid}— 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 в буфер.
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)
Записать необработанное 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-битное идентификатор объекта, используя тот же идентификатор, если этот SharedArrayBuffer уже был сериализован. При десериализации этот идентификатор будет передан в 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-v14.x/docs/api/v8.html