如何释放V8声称的内存?

时间:2013-03-08 11:33:30

标签: c++ memory embed v8 embedded-v8

我正在处理的应用程序嵌入V8来编写脚本。为了节省内存,我想在不需要时关闭脚本组件,但由于某种原因,内存永远不会返回给操作系统。

这是我试过的:

1。在持久化上下文句柄上调用Dispose()

context.Dispose();

2。强制垃圾收集

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

这些都不会对进程内存使用产生任何显着影响。我可以清楚地看到当剧本声称记忆时它是如何上升的,但它永远不会再次下降。

我正在使用ps -o rss确定进程内存使用情况。我知道如果没有分析器,确定一个进程正在使用多少内存是不可能的,但是我确实认为当V8释放内存时rs应该会停止。

2 个答案:

答案 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

中的用法