日期:2014-05-16  浏览次数:20466 次

初探js各大引擎之v8

以前没有自己写过js引擎任何的研究文章,最近一直在做前端性能优化的研究,今天在看各大js引擎优化细节相关的文档中看到了这些名词。

?

简单记录一下吧。

?

?

?

---------------V8

?

1. ? 下面的内容是查阅自维基百科

?

V8是一个由丹麦Google开发的开源JavaScript引擎,用于Google chrome。Lars Bak是组长,v8在执行之前将JavaScript编译成机器码,而非字节码或者是直译,以此提升性能。更进一步,使用了如内联等方法来提高性能。V8组译器是基于Strongtalk组译器。

?

2. ? 关于Lars Bak

?

--其实从1988年就开始参与虚拟机的开发,在1991年的时候参与了Self虚拟机的开发,到1997年Java HotSpot引擎技术的lead,同时也开发了高性能的Java ME虚拟机。所以其实在v8出来的时候,大哥已经在这个领域研究了20年。所以有的人说v8到现在还是最NB的引擎。

?

3. ? V8的特性简单介绍:

--来自官方http://code.google.com/intl/zh-CN/apis/v8/design.html


主要包含3个:

?

  • ?快速属性访问(Fast Property Access)
  • ?动态机器码生成(Dynamic Machine Code Generation)
  • ?高效的垃圾收集(Efficient Garbage Collection)
?? 这边我侧重说一下这个Efficient Garbage Collection

V8的所谓垃圾收集(garbage collection)是回收那些进程不再需要的对象占用的内存。为了确保快速的对象分配和缩短垃圾收集造成的停顿以及杜绝内存碎片,V8采用的是一种stop-the-world,generational,accurate的垃圾收集器。
这意味着V8
  • 在执行垃圾收集周期内停止程序执行
  • 在大部分的垃圾收集周期中,只处理对象堆的一部分。这会减轻停止应用程序而受到的影响。
  • 总是准确地知道内存中对象和指针的位置。这样就避免了错误地把对象当做指针而因此造成的内存泄露。
在V8中,对象堆被分成两个部分:一个是新创建的对象分配的空间,另一个是垃圾收集周期遗留下来的就的对象。如果在垃圾收集周期内某一个对象被移动了,V8会更新所有指向这个对象的指针到新的地址

v8中对于对象的类型采用的hidden class机制,而且v8有两个机器码的编译器,一个只做最简单的优化,避免了编译而造成的开销,另一个是用来坐复杂优化的。

ps:目前v8衍生出来了最近老火的node.js。直接将js覆盖到了后端开发。