v8 无法释放由上下文分配的内存
v8 impossible to free memory allocated by context
v8 版本:4.7.80.25
Isolate::CreateParams create_params;
create_params.array_buffer_allocator = &array_buffer_allocator;
Isolate* isolate = Isolate::New(create_params);
Locker locker(isolate);
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
Local<Context> ctx = Context::New(isolate);
Context::Scope context_scope(ctx);
Local<Script> script;
Local<String> name = String::NewFromUtf8(isolate, "wtf.js");
Local<String> source = String::NewFromUtf8(isolate, "var a = []; for(var i = 0; i < 300; i++) a.push(new Array(1000000).join('*'));");
ScriptOrigin origin(String::NewFromUtf8(isolate, "wtf.js"));
script = Script::Compile(ctx, source, &origin).ToLocalChecked();
Handle<Value> result = script->Run(ctx).ToLocalChecked();
ctx超出范围后没有任何反应,内存使用率仍然很高
我还尝试将 ctx 存储在持久句柄中并对其调用 .Reset - 成功率为零
仅当我调用 isolate->Dispose() 时才会释放内存
我解决了这个问题!
@xaxxon 完全正确,v8 上下文在超出范围后不会立即被垃圾回收。
为了检查它对 GC 的可达性,我简单地调用了 RequestGarbageCollectionForTesting
并且它确实释放了上下文内存
所以基本上没有什么可担心的 - 最终这个内存将再次可用。
v8 版本:4.7.80.25
Isolate::CreateParams create_params;
create_params.array_buffer_allocator = &array_buffer_allocator;
Isolate* isolate = Isolate::New(create_params);
Locker locker(isolate);
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
Local<Context> ctx = Context::New(isolate);
Context::Scope context_scope(ctx);
Local<Script> script;
Local<String> name = String::NewFromUtf8(isolate, "wtf.js");
Local<String> source = String::NewFromUtf8(isolate, "var a = []; for(var i = 0; i < 300; i++) a.push(new Array(1000000).join('*'));");
ScriptOrigin origin(String::NewFromUtf8(isolate, "wtf.js"));
script = Script::Compile(ctx, source, &origin).ToLocalChecked();
Handle<Value> result = script->Run(ctx).ToLocalChecked();
ctx超出范围后没有任何反应,内存使用率仍然很高 我还尝试将 ctx 存储在持久句柄中并对其调用 .Reset - 成功率为零
仅当我调用 isolate->Dispose() 时才会释放内存
我解决了这个问题!
@xaxxon 完全正确,v8 上下文在超出范围后不会立即被垃圾回收。
为了检查它对 GC 的可达性,我简单地调用了 RequestGarbageCollectionForTesting
并且它确实释放了上下文内存
所以基本上没有什么可担心的 - 最终这个内存将再次可用。