2013-03-08 4 views
1

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

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

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

context.Dispose(); 

2. Силу сбора мусора

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

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

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

+0

http://stackoverflow.com/questions/1421491/does-calling-free-or-delete-ever-release-memory-back-to-the- система – congusbongus

+0

Ouch. Постараюсь немного разобраться. Все равно будет интересно, если кто-то решит проблему с V8, хотя единственное решение, о котором я могу думать, - загрузить v8 в разветвленный процесс и убить его. – futlib

+0

Да, это действительно происходит с простой программой на C :(Все еще надеется на предложения о том, как заставить ОС восстановить память. – futlib

ответ

0

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

+0

Экспериментировавшись с этим, он чувствует себя таинственным, хотя. Если я выделил 100 МБ памяти в небольшая программа на C, память не восстанавливается до тех пор, пока программа не выйдет. Если я выберу 500 МБ вместо этого, она будет восстановлена ​​почти сразу. Любая идея, могу ли я заставить ОС вернуть ее? – futlib

+0

Я угадываю в своем эксперименте, некоторый порог, когда библиотека кучи ОС и/или приложений «решила», было достаточно памяти, чтобы гарантировать ее возврат в системный пул. Я не знаю стандартного способа повлиять на эти решения ... это компромисс между реализацией. Например, что, если вы пошли вперед и выделили и освободили 100MB снова и снова в цикле? – mark

0

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

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

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

Смежные вопросы