上一章简单的演示了一个helloworld demo。里面涉及到了v8的一些基本类型和概念,本章将围绕这个demo对v8的基本类型和相关概念进行讲解。
这里还是先把demo贴出来便于后面分析:
handle
在v8中,内存分配都是在v8的heap中进行分配的,javascript的值和对象也都存放在v8的heap中。这个heap由v8独立的去维护,失去引用的对象将会被v8的gc掉并可以重新分配给其他对象。而handle即是对heap中对象的引用。v8为了对内存分配进行管理,gc需要对v8中的所有对象进行跟踪,而对象都是用handle方式引用的,所以gc需要对handle进行管理,这样gc就能知道heap中一个对象的引用情况,当一个对象的handle引用为发生改变的时候,gc即可对该对象进行回收(gc)或者移动。因此,v8编程中必须使用handle去引用一个对象,而不是直接通过c++的方式去获取对象的引用,直接通过c++的方式去直接去引用一个对象,会使得该对象无法被v8管理。
handle分为local和persistent两种。从字面上就能知道,local是局部的,它同时被handlescope进行管理。persistent,类似与全局的,不受handlescope的管理,其作用域可以延伸到不同的函数,而local是局部的,作用域比较小。persistent handle对象需要persistent::new, persistent::dispose配对使用,类似于c++中new和delete.persistent::makeweak可以用来弱化一个persistent
handle,如果一个对象的唯一引用handle是一个persistent,则可以使用makeweak方法来如果该引用,该方法可以出发gc对被引用对象的回收。
handlescope
一个函数中,可以有很多handle,而handlescope则相当于用来装handle(local)的容器,当handlescope生命周期结束的时候,handle也将会被释放,会引起heap中对象引用的更新。handlescope是分配在栈上,不能通过new的方式进行创建。对于同一个作用域内可以有多个handlescope,新的handlescope将会覆盖上一个handlescope,并对local handle进行管理。下面通过代码来讲解handlescope的生命周期:
context
context值得是javascript的执行环境。每个javascript都必须执行在一个context中。context有多个,而且可以在不同的context中进行切换。
这段代码就是申请一个persistent contetxt,并通过context::scope切换到该context中。在这个demo中,
之后的所有操作都执行在context中。
我们还可以使用
来切换到context_ex中去。
这里只是简单的了解下context的概念,后面将单独开辟一个章节来详细讲述v8的context。

从这张图可以比较清楚的看到handle,handlescope,以及被handle引用的对象之间的关系。从图中可以看到,v8的对象都是存在v8的heap中,而handle则是对该对象的引用。
版权申明:
转载文章请注明原文出处,任何用于商业目的,请联系本人:[email protected]