1

我正在尝试使用 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 脚本而不会发生内存泄漏。

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

有人有什么想法吗?

4

0 回答 0