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 并且它确实释放了上下文内存

所以基本上没有什么可担心的 - 最终这个内存将再次可用。