开发手册 欢迎您!
软件开发者资料库

V8 | Node.js

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。

Node.js v8.x 中文文档


V8#

v8 模块暴露了特定于[V8][]版本内置到 Node.js 二进制文件中的API. 通过以下方式使用:

const v8 = require('v8');

注意: APIs 和实现可能在任何时间变动。

v8.cachedDataVersionTag()#

返回一个表示从V8版本,命令行标志和已检测到的CPU功能派生的“version tag”的整数。这对于判断[vm.Script][] cachedData是否兼容当前v8实例非常有用。

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

does_zap_garbage是个0/1式布尔值,它凸显是否设置了--zap_code_space选项。若为真,那么V8引擎会用一个位模式来覆盖堆中的垃圾。如此,RSS(常驻内存集)会变得越来越大,因为V8会一直征用所有的堆页,从而让他们更难被操作系统交换掉。

For example:

{  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}

v8.setFlagsFromString(string)#

v8.setFlagsFromString()可以被用来在脚本中设置V8引擎的命令行标识。此方法应该谨慎使用。在虚拟机已经运行后修改其设置可能会造成不可预测的结果,包括崩溃和数据丢失,或者一点作用也没有。

针对一个特定版本的Node.js,可供其使用的V8选项可以通过运行node --v8-options来获取。一个非官方的,由社区维护的选项清单及其效果可参见[这里][here]。

用法:

// Print GC events to stdout for one minute.const v8 = require('v8');v8.setFlagsFromString('--trace_gc');setTimeout(function() { v8.setFlagsFromString('--notrace_gc'); }, 60e3);

Serialization API#

稳定性: 1 - 实验性质

序列化API提供了一系列用于序列化JavaScript值的方法,它们兼容于[HTML structured clone algorithm][]。格式是向下兼容的(可以安心存储于硬盘中)。

注意: 此API正在开发中,任何变化(包括不兼容的API或者传输格式)可能会随时发生直到此警告被移除。

v8.serialize(value)#

  • Returns:

使用[DefaultSerializer][]来序列化value到一个缓冲区中。

v8.deserialize(buffer)#

  • buffer | 由[serialize()][]返回的一个缓冲区。

用默认配置来执行[DefaultDeserializer][]从而从一个缓冲区中读取一个JS值

class: v8.Serializer#

new Serializer()#

创建一个新的Serializer对象。

serializer.writeHeader()#

写出一个包含序列化格式版本的头文件

serializer.writeValue(value)#

序列化一个JavaScript值并将结果加入内部的缓冲区。

如果value不能被序列化则抛出错误。

serializer.releaseBuffer()#

返回存储里的内部缓冲区。若缓冲区已经被释放则不应该使用此序列化机制。如果之前的一次写入操作失败,那么执行此方法会造成不可预知的行为。

serializer.transferArrayBuffer(id, arrayBuffer)#

  • id 一个32位的无符号整型。
  • arrayBuffer 一个ArrayBuffer实例。

标记一个ArrayBuffer, 表明它的内容正在被带外传输中。同时将ArrayBuffer包裹于一个反序列化的上下文内,之后将结果传入[deserializer.transferArrayBuffer()][]中。

serializer.writeUint32(value)#

  • value

写出一个原始32位无符号整型。此方法在一个自定义的[serializer._writeHostObject()][]中使用.

serializer.writeUint64(hi, lo)#

  • hi
  • lo

写出一个原始64位无符号整型,会被拆分成高32位和低32位两部分。此方法用于一个自定义的[serializer._writeHostObject()][].

serializer.writeDouble(value)#

  • value

写出一个JS的number值。从方法用于一个自定义的[serializer._writeHostObject()][].

serializer.writeRawBytes(buffer)#

  • buffer |

将原始字节写入序列化机制的内部缓冲区中。反序列化机制会有对应的方法来获得缓冲区的长度。 此方法用于一个自定义的[serializer._writeHostObject()][]中。

serializer._writeHostObject(object)#