Как освободить память, заявленную V8?

Приложение, над которым я работаю, встраивает V8 для сценариев. Чтобы сохранить память, я хочу выключить компонент сценариев, когда он не нужен, но по какой-то причине память никогда не возвращается в ОС.

Вот что я попробовал:

1. Вызвать Dispose () для дескриптора постоянного контекста

context.Dispose();

2. Принудительная сборка мусора

while (!v8::V8::IdleNotification());

Ничто из этого не оказывает заметного влияния на использование памяти процессами. Я ясно вижу, как он работает, когда скрипт требует памяти, но он никогда не падает снова.

Я определяю использование памяти процесса с ps -o rss, Я знаю, что выяснить, сколько памяти использует процесс, на самом деле невозможно без профилировщика, но я верю, что rss должен отключиться, когда V8 освободит память.

1

Решение

ОС может просто не восстанавливать память (например, по соображениям производительности), даже если ваше приложение освободило ее правильно. Куча приложения также может удерживать память на случай, если она понадобится вам снова быстро. В любом случае, если вы уверены, что у вас нет утечки (попробуйте что-то вроде valgrind), я бы об этом не беспокоился.

0

Другие решения

Просто потратил несколько часов на борьбу с этим и в итоге пришлось копаться в api.cc V8.

Оказывается, V8 выводит последний экземпляр шаблона глобального объекта для быстрого повторного использования (будь то необработанный ObjectTemplate или производный от FunctionTemplate для прокси). Что очень сбивает с толку при попытке принудительного сброса GC. Обходной путь — выделить новый фиктивный контекст (используя тот же шаблон, что и для контекста, который вы пытаетесь очистить).

static void do_gc()
{
{
Isolate *i = Isolate::GetCurrent();
HandleScope h(i);
Handle<Context> c = Context::New(i); // Default contexes
Handle<Context> c = Context::New(i, 0, objtemplate); // With custom object
Handle<Context> c = Context::New(i, 0, fntemplate->InstanceTemplate()); // With proxy
}
while (!v8::V8::IdleNotification());
}

Чтобы увидеть использование в контексте https://github.com/katlogic/lv8/blob/344353dac702901c917a4c05438252121c527ab3/lv8.cpp#L755

0

По вопросам рекламы [email protected]