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 相关文章推荐
JS 如何获取radio选中后的值及不选择取radio的值
Oct 28 Javascript
javascript模拟命名空间
Apr 17 Javascript
完美实现仿QQ空间评论回复特效
May 06 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
Oct 14 Javascript
jQuery.deferred对象使用详解
Mar 18 Javascript
详解javascript跨浏览器事件处理程序
Mar 27 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
May 30 Javascript
CodeMirror js代码加亮使用总结
Mar 25 Javascript
node.js调用Chrome浏览器打开链接地址的方法
May 17 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
Aug 29 Javascript
jQuery实现雪花飘落效果
Aug 02 jQuery
vue祖孙组件之间的数据传递案例
Dec 07 Vue.js
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
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
Python netmiko模块的使用
2020/02/14 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
浅谈python锁与死锁问题
2020/08/14 Python
师范大学应届生求职信
2013/11/21 职场文书
群众路线剖析材料
2014/02/02 职场文书
聚美优品励志广告词
2014/03/14 职场文书
车辆委托书范本
2014/10/05 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
大学军训心得体会800字
2016/01/11 职场文书
nginx location优先级的深入讲解
2021/03/31 Servers
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
Java 多线程协作作业之信号同步
2022/05/11 Java/Android