v8无法释放上下文

时间:2016-01-09 14:22:26

标签: memory-leaks v8

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-&gt; Dispose()

时释放内存

1 个答案:

答案 0 :(得分:1)

我解决了这个问题!

@xaxxon是完全正确的,v8上下文不会在它超出范围后立即被垃圾收集。 要检查GC的可达性,我只需调用RequestGarbageCollectionForTesting,它确实释放了上下文内存

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