2016-01-09 4 views
0

v8 версия: 4.7.80.25v8 невозможно освободить память выделяется из контекста

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()

+1

О какой конкретной памяти вы спрашиваете? Javascript-память очищается только тогда, когда сборщик мусора решает собрать его. Это зависит от нескольких вещей, включая память, которую он считает выделенной (она даже не будет работать, если памяти не так много) и имеет время ее запуска. – xaxxon

ответ

1

Я решил этот вопрос!

@xaxxon был абсолютно прав, v8 контекст не будет собирать мусор сразу после его выхода из сферы действия. Чтобы проверить доступность для GC, я просто вызвал RequestGarbageCollectionForTesting, и он действительно освободил контекстную память

Так что в принципе не о чем беспокоиться - в конце концов эта память снова будет доступна.