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