@@ -25,27 +25,27 @@ V8更加直接的将抽象语法树通过JIT技术转换成本地代码,放弃
25
25
### Handle 概念
26
26
在V8中,内存分配都是在V8的Heap中进行分配的,JavaScript的值和对象也都存放在V8的Heap中。这个Heap由V8独立的去维护,失去引
27
27
用的对象将会被V8的GC掉并可以重新分配给其他对象。而Handle即是对Heap中对象的引用。V8为了对内存分配进行管理,GC需要对V8中的
28
- 所有对象进行跟踪,而对象都是用Handle方式引用的,所以GC需要对Handle进行管理,这样GC就能知道Heap中一个对象的引用情况,当一个对象的Handle引用为发生改变的时候 ,GC即可对该对象进行回收或者移动。因此,V8编程中必须使用Handle去引用一个对象,而不是直接通过C
28
+ 所有对象进行跟踪,而对象都是用Handle方式引用的,所以GC需要对Handle进行管理,这样GC就能知道Heap中一个对象的引用情况,当一个对象的Handle引用发生改变的时候 ,GC即可对该对象进行回收或者移动。因此,V8编程中必须使用Handle去引用一个对象,而不是直接通过C
29
29
++的方式去获取对象的引用,直接通过C++的方式去直接去引用一个对象,会使得该对象无法被V8管理。
30
30
31
31
Handle分为Local和Persistent两种。
32
32
33
33
从字面上就能知道,Local是局部的,它同时被HandleScope进行管理。persistent,类似与全局的,不受HandleScope的管理,其作用域可以延伸到不同的函数,而Local是局部的,作用域比较小。Persistent Handle对象需要Persistent::New, Persistent::Dispose配对使用,类似于C++中new和delete.Persistent::MakeWeak可以用来弱化一个Persistent Handle,如果一个对象的唯一引用Handle是一个Persistent,则可以使用MakeWeak方法来如果该引用,该方法可以出发GC对被引用对象的回收。
34
34
35
- ### Scope
35
+ ### Scope
36
36
从概念上理解,作用域可以看成是一个句柄的容器,在一个作用域里面可以有很多很多个句柄(也就是说,一个scope里面可以包含很多很多个
37
37
v8引擎相关的对象),句柄指向的对象是可以一个一个单独地释放的,但是很多时候(真正开始写业务代码的时候),一个一个地释放句柄过于
38
38
繁琐,取而代之的是,可以释放一个scope,那么包含在这个scope中的所有handle就都会被统一释放掉了。
39
39
40
- Scope在v8.h中有这么几个:HandleScope,Context::Scope。HandleScope是用来管理
40
+ Scope在v8.h中有这么几个:HandleScope,Context::Scope。HandleScope是用来管理
41
41
Handle的,而Context::Scope仅仅用来管理Context对象。代码像下面这样:
42
42
``` c++
43
- // 在此函数中的Handle都会被handleScope管理
44
- HandleScope handleScope;
45
- // 创建一个js执行环境Context
43
+ // 在此函数中的Handle都会被handleScope管理
44
+ HandleScope handleScope;
45
+ // 创建一个js执行环境Context
46
46
Handle <Context> context = Context::New();
47
- Context::Scope contextScope (context);
48
- //其它代码
47
+ Context::Scope contextScope (context);
48
+ //其它代码
49
49
```
50
50
一般情况下,函数的开始部分都放一个HandleScope,这样此函数中的Handle就不需要再理会了释放资源了。
51
51
而Context::Scope仅仅做了:在构造中调用context->Enter(),而在析构函数中调用context->Leave()。
@@ -131,4 +131,4 @@ V8采用了标记指针法:这种方法需要在每个指针的末位预留一
131
131
### 参考
132
132
* https://developers.google.com/v8/get_started
133
133
* https://developers.google.com/v8/embed
134
- * http://newhtml.net/v8-garbage-collection/
134
+ * http://newhtml.net/v8-garbage-collection/
0 commit comments