V8 Сборка мусора отличается для шаблонов объектов и объектов, созданных с их помощью - PullRequest
0 голосов
/ 12 июня 2019

Сборка мусора в 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();
}

Здесь размер резидентного набора линейно увеличивается, пока не будет использовано ненужное количество оперативной памяти длятакая маленькая программа.Просто хочу понять, что здесь происходит.Извините за длинное объяснение, я постарался сделать его коротким и по существу: с.Заранее спасибо!

1 Ответ

0 голосов
/ 13 июня 2019

V8 предполагает, что ObjectTemplates являются долгоживущими и, следовательно, распределяет их в части «старого поколения» кучи, где им требуется больше времени для сбора (сравнительно медленным и редким) полным циклом GC - если предположение было правильным, и они на самом деле долговечны, это общая победа производительности. С другой стороны, сами объекты размещаются в «молодом поколении», где их можно легко и быстро собрать (сравнительно часто) в циклах ГК молодого поколения.

Если вы работаете с --trace-gc, вы должны увидеть это подтверждение.

...