Skip to content

Commit 2edfb78

Browse files
committed
Merge branch 'master' of github.com:yjhjstz/deep-into-node
2 parents e0cf4a8 + 744e7fb commit 2edfb78

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

Diff for: .editorconfig

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# editorconfig.org
2+
root = true
3+
4+
[*]
5+
indent_style = space
6+
indent_size = 2
7+
end_of_line = lf
8+
charset = utf-8
9+
trim_trailing_whitespace = true
10+
insert_final_newline = true
11+
12+
[*.md]
13+
trim_trailing_whitespace = false

Diff for: chapter2/chapter2-0.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,27 @@ V8更加直接的将抽象语法树通过JIT技术转换成本地代码,放弃
2525
### Handle 概念
2626
在V8中,内存分配都是在V8的Heap中进行分配的,JavaScript的值和对象也都存放在V8的Heap中。这个Heap由V8独立的去维护,失去引
2727
用的对象将会被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
2929
++的方式去获取对象的引用,直接通过C++的方式去直接去引用一个对象,会使得该对象无法被V8管理。
3030

3131
Handle分为Local和Persistent两种。
3232

3333
从字面上就能知道,Local是局部的,它同时被HandleScope进行管理。persistent,类似与全局的,不受HandleScope的管理,其作用域可以延伸到不同的函数,而Local是局部的,作用域比较小。Persistent Handle对象需要Persistent::New, Persistent::Dispose配对使用,类似于C++中new和delete.Persistent::MakeWeak可以用来弱化一个Persistent Handle,如果一个对象的唯一引用Handle是一个Persistent,则可以使用MakeWeak方法来如果该引用,该方法可以出发GC对被引用对象的回收。
3434

35-
### Scope
35+
### Scope
3636
从概念上理解,作用域可以看成是一个句柄的容器,在一个作用域里面可以有很多很多个句柄(也就是说,一个scope里面可以包含很多很多个
3737
v8引擎相关的对象),句柄指向的对象是可以一个一个单独地释放的,但是很多时候(真正开始写业务代码的时候),一个一个地释放句柄过于
3838
繁琐,取而代之的是,可以释放一个scope,那么包含在这个scope中的所有handle就都会被统一释放掉了。
3939

40-
Scope在v8.h中有这么几个:HandleScope,Context::Scope。HandleScope是用来管理
40+
Scope在v8.h中有这么几个:HandleScope,Context::Scope。HandleScope是用来管理
4141
Handle的,而Context::Scope仅仅用来管理Context对象。代码像下面这样:
4242
```c++
43-
//在此函数中的Handle都会被handleScope管理
44-
HandleScope handleScope;
45-
//创建一个js执行环境Context
43+
//在此函数中的Handle都会被handleScope管理
44+
HandleScope handleScope;
45+
//创建一个js执行环境Context
4646
Handle<Context> context = Context::New();
47-
Context::Scope contextScope(context);
48-
//其它代码
47+
Context::Scope contextScope(context);
48+
//其它代码
4949
```
5050
一般情况下,函数的开始部分都放一个HandleScope,这样此函数中的Handle就不需要再理会了释放资源了。
5151
而Context::Scope仅仅做了:在构造中调用context->Enter(),而在析构函数中调用context->Leave()。
@@ -131,4 +131,4 @@ V8采用了标记指针法:这种方法需要在每个指针的末位预留一
131131
### 参考
132132
* https://developers.google.com/v8/get_started
133133
* https://developers.google.com/v8/embed
134-
* http://newhtml.net/v8-garbage-collection/
134+
* http://newhtml.net/v8-garbage-collection/

0 commit comments

Comments
 (0)