我正在尝试使用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()具有相同的内存泄漏。
有人有想法吗?