V8嵌入开发(二)

Isolate 隔离

Isolate是v8中最重要的功能类,代表了一个v8 VM的实例。 一个Isolate是一份独立的V8 runtime, 包括但不限于一个heap管理器,垃圾回收器等。在一个时间段内,有且只有一个线程能使用此isolate。不过,多个线程可以同时使用多个isolate。

它不是线程安全的,如果在线程不安全情况下运行需要加锁。

创建一个Isolate实例

v8::Isolate::CreateParams create_params;
create_params.array_buffer_allocator =
      v8::ArrayBuffer::Allocator::NewDefaultAllocator(https://ashan.org/static/);
v8::Isolate* isolate = v8::Isolate::New(https://ashan.org/static/create_params);
v8::Isolate::Scope isolate_scope(https://ashan.org/static/isolate);

CreateParams配置参数

创建一个 Isolate 实例,其CreateParams 参数是必须的。其主要成员如下:

code_event_handler

当代码发生变化时,进行回调,默认时空指针。

void OnCodeEventHandle(https://ashan.org/static/const v8::JitCodeEvent* event){

    std::cout << "type:" << event->type << " ";
    std::cout << "codeType:" << event->code_type  << " ";
    std::cout << "codeLen:" << event->code_len  << " ";
    std::cout << "name:" << event->name.str <<  std::endl;
}

...
v8::Isolate::CreateParams create_params;
create_params.code_event_handler = OnCodeEventHandle;

constraints 设置资源大小

指定运行时内存使用限制的一组约束。必须在初始化VM之前设置堆大小-在初始化VM之后无法调整大小。 如果您使用的是线程,那么在设置堆栈限制时应该保持V8::Locker锁,并且必须为每个线程分别设置非默认堆栈限制。

set_max_semi_space_size, set_max_old_space_size, set_max_executable_size, set_code_range_size 单位 MB. set_max_semi_space_size_in_kb 单位 KB.

snapshot_blob 快照数据

如果要设置这个,需要自己先read 文件,然后解析为 StartupData 对象并赋值。

v8::Isolate::Scope 域

构造的时候传入isolate,执行isolate->Enter(),虚构的时候执行isolate->Exit(),本质上就是Enter/Exit的操作。 一个线程中可以创建多个isolate,多个isolate是一个栈式管理的,Enter相当于入栈,Exit相当于出栈。获取当前处在哪个隔离则是v8::Isolate->GetCurrent函数。

如:创建两个隔离,对隔离进行如下操作:

  1. isolate1->Enter() ——— 执行后当前隔离是isolate1
  2. isolate2->Enter() ——— 执行后当前隔离是isolate2
  3. isolate2->Exit() ——— 执行后当前隔离是isolate1
  4. isolate1->Exit() ——— 执行后当前隔离是null

Scope不是必须的,当不存在Scope时,isolate依然可以正常执行