我正在处理的应用程序嵌入V8来编写脚本。为了节省内存,我想在不需要时关闭脚本组件,但由于某种原因,内存永远不会返回给操作系统。
这是我试过的:
1。在持久化上下文句柄上调用Dispose()
context.Dispose();
2。强制垃圾收集
while (!v8::V8::IdleNotification());
这些都不会对进程内存使用产生任何显着影响。我可以清楚地看到当剧本声称记忆时它是如何上升的,但它永远不会再次下降。
我正在使用ps -o rss
确定进程内存使用情况。我知道如果没有分析器,确定一个进程正在使用多少内存是不可能的,但是我确实认为当V8释放内存时rs应该会停止。
答案 0 :(得分:0)
即使您的应用程序已正确释放,操作系统也可能根本不回收内存(例如出于性能原因)。应用程序堆也可能正在保存内存,以防您再次需要它。无论哪种方式,如果你确定你没有泄漏(尝试像valgrind这样的东西),我不会担心它。
答案 1 :(得分:0)
花了几个小时摔跤,最终不得不深入研究V8的api.cc。
将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
中的用法