v8 ::上下文内存泄漏

时间:2015-07-08 13:57:41

标签: c++ node.js memory-leaks v8 node.js-addon

我正在尝试使用v8在C ++上开发nodejs模块。

这是源代码。

#include <node.h>

using namespace v8;

void TestContext1(const FunctionCallbackInfo<Value>& args) {

    Isolate* isolate = Isolate::New();
    {
        Isolate::Scope isolate_scope(isolate);
        V8::Initialize();
        Locker lock(isolate);

        HandleScope handle_scope(isolate);

        Local<Context> context = Context::New(isolate);
        Context::Scope context_scope(context);


        Handle<String> strExpr = Handle<String>::Cast(args[0]);
        Handle<Script> script;
        Handle<Value> res;

        TryCatch tryCatch;
        script = Script::Compile(strExpr);
        res = script->Run();

        if (tryCatch.HasCaught()) {
            res = tryCatch.Message()->Get();
        }

        args.GetReturnValue().Set(res);
    }
    isolate->Dispose();

}


void TestContext2(const FunctionCallbackInfo<Value>& args) {

    Isolate *isolate = args.GetIsolate();
    Isolate::Scope isolate_scope(isolate);
    HandleScope handle_scope(isolate);
    Local<Context> context = Context::New(isolate);
    Context::Scope context_scope(context);

    Handle<String> strExpr = Handle<String>::Cast(args[0]);
    Handle<Script> script;
    Handle<Value> res;

    TryCatch tryCatch;
    script = Script::Compile(strExpr);
    res = script->Run();

    if (tryCatch.HasCaught()) {
        res = tryCatch.Message()->Get();
    }

    args.GetReturnValue().Set(res);
}

void Init(Handle<Object> exports, Handle<Object> module) {
    NODE_SET_METHOD(exports, "TestContext1", TestContext1);
    NODE_SET_METHOD(exports, "TestContext2", TestContext2);
}

NODE_MODULE(addon, Init)

然后用js代码测试它:

var addon = require('addon.node')
var i = 0;
setInterval(function () {
    msg = addon.TestContext1("process.exit()"); // or msg = addon.TestContext2("process.exit()");
    console.log(msg, i++, process.memoryUsage().heapUsed/1024/1024);
}, 2);

每个功能都有不同的问题:

TestContext1 工作正常但访问全局上下文并关闭进程。

TestContext2 无法访问全局上下文,但会导致内存泄漏。

我需要的所有内容 - 在没有内存泄漏的情况下在隔离的上下文中执行js脚本。

node vm不起作用,因为vm.runInNewContext()具有相同的内存泄漏。

有人有想法吗?

0 个答案:

没有答案