有关chrome V8

234 阅读2分钟

概述

浏览器和Node是V8引擎的两个宿主,前者主要包含了Dom、window等对象内容,后者提供了文件系统,网络操作等。

环境差异

image.png

浏览器中除了V8作为JavaScript引擎外,还有一个WebKit布局引擎。

Node的结构与Chrome十分相似,都是基于事件驱动的异步架构,浏览器通过事件驱动来服务界面的交互,Node则服务I/O。

内存

V8高效的一个原因就是内存。

Node是由C++开发的程序,底层是两部分:

  • chrome v8:是Js的运行时,解释执行js
  • libuv:实现了老生常谈的“事件循环”

其中v8又是c++开发的,你在自己的JavaScript代码中声明了一个变量,那么这个变量将被V8的内存机制进行管理。v8创建的c++类型,和js中的操作是在内存中相同的存储单元。而v8创建的存储单元是否能被回收,就是看js变量在js中是否已经不被引用了。

作为Node开发者,应该对V8老生代内存和新生代内存耳熟能详。新生代特点是小而频,其区域小但是垃圾回收频繁。

句柄

句柄是Chrome V8中的一个重要概念,它提供了对于堆内存中JavaScript数据对象的一个引用。

Chrome V8在进行垃圾回收的时候,通常会将JavaScript的数据对象移来移去。如果使用指针的话,一旦一个对象被移走,这个指针就成了野指针。而使用句柄,让其断不了联系。

模板

v8的模板指的是一个模具,你可以用一个模板来把C++函数或者数据结构包裹进JavaScript的对象中,这样JavaScript代码就能对它做一些事情。

Node.js的C++核心模块就有被这样包裹的。Google Chrome中的DOM节点实际上也是用C++完成的,然后再用模板包裹成JavaScript对象,这样我们就能在浏览器中使用JavaScript来对它们进行操作了。