Сборка мусора в V8, кажется, легко очищается, поскольку она получает значение Local<T>
, где T
что-либо хранится в Local
, однако, если вы создаете ObjectTemplate
, а затем создаете экземпляр этого Object
,v8 будет ждать очистки памяти.Рассмотрим следующий пример, в котором размер резидентного набора остается стабильным на протяжении всего выполнения программы:
Isolate* isolate = Isolate::New(create_params);
Persistent<Context> *context= ContextNew(isolate); // creates a persistent context
for(int i = 1 ; i <= 1000000; i ++ ) {
isolate->Enter();
EnterContext(isolate, context); // enters the context
{
HandleScope handle_scope(isolate);
Local<Object> result = Object::New(isolate);
}
ExitContext(isolate, context);
isolate->Exit();
}
Выше мы всего лишь создаем новый Object
в цикле, а затем handle_scope
выходит из области видимости ипохоже, что выделенные значения Local
являются мусором, собираемым сразу, так как размер жилого набора остается стабильным.Однако существует проблема, когда этот объект создается с помощью ObjectTemplate
, который также создается в цикле:
Isolate* isolate = Isolate::New(create_params);
Persistent<Context> *context= ContextNew(isolate); // creates a persistent context
for(int i = 1 ; i <= 1000000; i ++ ) {
isolate->Enter();
EnterContext(isolate, context); // enters the context
{
HandleScope handle_scope(isolate);
Local<Object> result;
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
if (!templ->NewInstance(context->Get(isolate)).ToLocal(&result)) { exit(1); }
}
ExitContext(isolate, context);
isolate->Exit();
}
Здесь размер резидентного набора линейно увеличивается, пока не будет использовано ненужное количество оперативной памяти длятакая маленькая программа.Просто хочу понять, что здесь происходит.Извините за длинное объяснение, я постарался сделать его коротким и по существу: с.Заранее спасибо!