Embedder‘s Guide(记得FQ)
如果你已经读过 Getting Started, 那么现在,你已经对V8的一些关键概念比较熟悉了。比如,V8是一个独立的虚拟机,V8的handle,scope和context的概念。
这篇文章更进一步讨论了这些概念,并且介绍了另外的一些将V8嵌入到C++中至关重要的概念。
V8的API提供了这样一些功能,包括编译和执行脚本,访问C++中的方法和数据结构,处理错误以及开启安全检查。你的应用程序可以像使用其他一些C++库一样来使用V8,而只需要包含它的头文件 v8.h。
V8 Design Elements 提供了一些关于V8的背景知识,如果你想优化你的V8应用程序,你应该会感兴趣的。
适合本文的读者
这篇文章适用于那些想把V8 JavaScript引擎嵌入到C++程序中,同时让JavaScript和C++中的对象和方法互相可见的C++程序猿。
Handles(句柄)和垃圾回收
一个Handle指向一个在堆中的JavaScript对象。 V8垃圾搜集器回收那些无法被再次访问的对象所占用的内存。在垃圾搜集过程中,搜集器时常将对象移动到一个不同的位置(当然,对象至始至终都在堆中)。不过不用担心,当垃圾搜集器移动对象时,它会自动更新每个Handle,以确保它们指向原来的对象。
如何判定一个对象变成垃圾了呢?
如果一个对象已经无法在JavaScript中被访问,并且也没有Handle指向它,这个时候,它就被认定成垃圾了。
垃圾搜集器会时不时的处理掉这些垃圾来回收内存。
V8的垃圾搜集机制是V8良好表现的重要原因,如果你想深入了解,V8 Design Elements 也包含了相关内容。
Handle的各种类型:
a. Local handle(局部句柄?)存在于栈中,当相关的析构函数被调用时,会被自动清理掉。这些Local handles的生命周期由容纳它们的handle scope决定。Handle scope通常在函数调用之初被创建。当Handle scope被删除时,垃圾搜集器将大开杀戒,清除掉所有Handle scope中的handle所指向的对象。当然,这些对象就不可能再在JavaScript中被访问,也不会被其它的handle来指向了。这种类型的handle在Getting Started(见“之一”)可以找到。
Local handle的形式为:Local<SomeType>
注意:Handle的栈并不是C++栈的一部分,但handle scope的栈却是嵌入在C++的栈中的。而且Handle scope只能在栈中被创建,也就是说不能new出来(为什么?因为new出来的东东存在于堆中)。
b.