Node.js API详解之 V8模块用法实例分析


Posted in Javascript onJune 05, 2020

本文实例讲述了Node.js API详解之 V8模块用法。分享给大家供大家参考,具体如下:

Node.js API详解之 V8

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

const v8 = require('v8');

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

v8.cachedDataVersionTag()

说明:

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

demo:

const v8 = require('v8');
console.log( v8.cachedDataVersionTag() );
// 2299951209

v8.getHeapSpaceStatistics()

说明:

返回关于v8堆空间的统计,即组成v8堆的片段。
通过V8 GetHeapSpaceStatistics 函数提供统计信息,无论堆空间的顺序,或是堆空间的可用性都可以被保证,并且可能是多个V8版本。

demo:

const v8 = require('v8');
console.log( v8.getHeapSpaceStatistics() );
// [ { space_name: 'new_space',
//   space_size: 2097152,
//   space_used_size: 706992,
//   space_available_size: 324176,
//   physical_space_size: 2051712 },
//  { space_name: 'old_space',
//   space_size: 2420736,
//   space_used_size: 2325072,
//   space_available_size: 176,
//   physical_space_size: 2368592 } ]

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会一直征用所有的堆页,从而让他们更难被操作系统交换掉。

demo:

const v8 = require('v8');
console.log( v8.getHeapStatistics() );
// { total_heap_size: 7159808,
//  total_heap_size_executable: 3670016,
//  total_physical_size: 6020992,
//  total_available_size: 1492618992,
//  used_heap_size: 4550336,
//  heap_size_limit: 1501560832,
//  malloced_memory: 8192,
//  peak_malloced_memory: 1185928,
//  does_zap_garbage: 0 }

v8.setFlagsFromString(string)

说明:

v8.setFlagsFromString()可以被用来在脚本中设置V8引擎的命令行标识。此方法应该谨慎使用。
在虚拟机已经运行后修改其设置可能会造成不可预测的结果,包括崩溃和数据丢失,或者一点作用也没有。
针对一个特定版本的Node.js,可供其使用的V8选项可以通过运行node ?v8-options来获取。
一个非官方的,由社区维护的选项清单及其效果可参见这里。

demo:

const v8 = require('v8');
v8.setFlagsFromString('mbp v8');

Serialization API

说明:

序列化API提供了一系列用于序列化JavaScript值的方法,它们兼容于HTML structured clone algorithm。
格式是向下兼容的(可以安心存储于硬盘中)。
注意: 此API正在开发中,任何变化(包括不兼容的API或者传输格式)可能会随时发生直到此警告被移除。

v8.serialize(value)

说明:

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

demo:

const v8 = require('v8');
console.log( v8.serialize('isjs') );
//

v8.deserialize(buffer)

说明:

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

demo:

const v8 = require('v8');
const serializeVal = v8.serialize('isjs');
console.log( serializeVal );
// 
console.log( v8.deserialize(serializeVal);
// isjs

class: v8.DefaultSerializer

说明:

Serializer的子类,用来将TypedArray(尤其是Buffer)和Dataview序列化成一个宿主对象,
并且对于它们底层的ArrayBuffer,只有被它们实际指向的部分会被存储起来。

class: v8.DefaultDeserializer

说明:

Deserializer的一个子类,根据DefaultSerializer的格式而定。

new Serializer()

说明:

创建一个新的Serializer对象。

serializer.writeHeader()

说明:

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

serializer.writeValue(value)

说明:

序列化一个JavaScript值并将结果加入内部的缓冲区。
如果value不能被序列化则抛出错误。

serializer.releaseBuffer()

说明:

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

serializer.transferArrayBuffer(id, arrayBuffer)

说明:

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

serializer.writeUint32(value)

说明:

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

serializer.writeUint64(hi, lo)

说明:

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

serializer.writeDouble(value)

说明:

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

serializer.writeRawBytes(buffer)

说明:

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

serializer._writeHostObject(object)

说明:

此方法用来写出某种宿主对象,进一步说,是由绑定的原生C++代码所生成的一个对象。
如果无法序列化object,那么一个恰当的异常会被抛出。
此方法在Serializer对象本身是不存在的,但可在其子类中提供。

serializer._getDataCloneError(message)

说明:

当一个对象无法被克隆时,会使用此方法来生成待抛出的错误对象。
此方法默认为Error的构造函数,可以在子类中被覆盖。

serializer._getSharedArrayBufferId(sharedArrayBuffer)

说明:

当序列化机制将要序列化一个ShareArrayBuffer对象时会调用此方法。
它必须为这对象返回一个32位无符号整型的ID,但若这个对象已被序列化过,则返回上一次序列化时所分配的ID。
这个ID会在对象被反序列化时传入deserializer.transferArrayBuffer()中。
如果对象不能被序列化,则抛出异常。
Serializer类本身不包含此方法,但可以在其子类中设置它。

serializer._setTreatArrayBufferViewsAsHostObjects(flag)

说明:

表明是否视TypedArray,DataView对象为宿主对象,也就是说,是否能将他们传入serializer._writeHostObject()中。
默认以上对象非宿主对象。

new Deserializer(buffer)

说明:

生成一个新的Deserializer对象。

deserializer.readHeader()

说明:

读取并验证一个头文件(包含格式信息)。
验证在某些情况下有可能不会通过,比如传输格式不合格或者不被支持。
若发生上述情况,那么一个Error会被抛出。

deserializer.readValue()

说明:

从缓冲区中反序列化一个JavaScript值,并返回它。

deserializer.transferArrayBuffer(id, arrayBuffer)

说明:

标记一个ArrayBuffer, 表明它的内容正在被带外传输中。
同时将ArrayBuffer包裹于一个序列化的上下文内,之后将结果传入serializer.transferArrayBuffer()中
(当arrayBuffer是ShareArrayBuffer实例时,返回serializer._getSharedArrayBufferId()产生的id)

deserializer.getWireFormatVersion()

说明:

读取底层的传输格式的版本。很可能有助于遗留代码来读取旧的传输格式版本。
不可在.readHeader()之前调用此方法。

deserializer.readUint32()

说明:

读取并返回一个原始32位无符号整型。
用于一个自定义的deserializer._readHostObject()。

deserializer.readUint64()

说明:

读取一个原始64位无符号整型,将其拆分成一个包含两个32位无符号整型的[hi, lo]数组,并返回此数组。
用于一个自定义的deserializer._readHostObject()。

deserializer.readDouble()

说明:

读取一个JSnumber值。 用于一个自定义的deserializer._readHostObject()。

deserializer.readRawBytes(length)

说明:

从反序列化机制的内部缓冲区中读取原始字节。length必须和传入serializer.writeRawBytes()中的缓冲区的长度相符。
用于一个自定义的serializer.writeRawBytes()。

deserializer._readHostObject()

说明:

此方法用来写出某种宿主对象,进一步说,是由绑定的原生C++代码所生成的一个对象。
如果无法序列化数据,那么一个恰当的异常会被抛出。
此方法在Deserializer对象本身上是不存在的,但可有其子类提供。

希望本文所述对大家node.js程序设计有所帮助。

Javascript 相关文章推荐
javascript对数组的常用操作代码 数组方法总汇
Jan 27 Javascript
js时间日期和毫秒的相互转换
Feb 22 Javascript
原生javascript和jquery判断浏览器版本等信息
Jul 04 Javascript
js有序数组的连接问题
Oct 01 Javascript
javascript实现时间格式输出FormatDate函数
Jan 13 Javascript
jQuery代码实现表格中点击相应行变色功能
May 09 Javascript
详解Angular2中的编程对象Observable
Sep 17 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
Sep 20 Javascript
js数组操作方法总结(必看篇)
Nov 22 Javascript
基于JavaScript实现购物车功能
Feb 07 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
Sep 28 Javascript
vue切换菜单取消未完成接口请求的案例
Nov 13 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
Jun 05 #Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
Jun 05 #Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 #Javascript
Jquery滑动门/tab切换实现方法完整示例
Jun 05 #jQuery
详解JS函数防抖
Jun 05 #Javascript
Vuex的各个模块封装的实现
Jun 05 #Javascript
js实现表单项的全选、反选及删除操作示例
Jun 05 #Javascript
You might like
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
js的event详解。
2006/09/06 Javascript
几个javascript操作word的参考代码
2009/10/26 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
使用jQuery.Pin垂直滚动时固定导航
2017/05/24 jQuery
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
微信小程序实现电影App导航和轮播
2020/11/30 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
简单介绍Python中的decode()方法的使用
2015/05/18 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
pygame实现简易飞机大战
2018/09/11 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
python实现杨氏矩阵查找
2019/03/02 Python
PyQt5响应回车事件的方法
2019/06/25 Python
python生成requirements.txt的两种方法
2019/09/18 Python
Giglio德国网上精品店:奢侈品服装和配件
2016/09/23 全球购物
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
安全标准化汇报材料
2014/02/03 职场文书
数控技术专业毕业自荐书范文
2014/02/05 职场文书
大学生受助感言
2015/08/01 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
python解决12306登录验证码的实现
2021/04/18 Python
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript