Hi Ben.
Thank you for your responding.
I see about Sample 1.
But what about Sample 2? There is memory leaks when I use this test code:
setInterval(function () {
msg = addon.TestContext2("1==1");
console.log(msg, i++, process.memoryUsage().heapTotal/1024/1024);
}, 2);
среда, 8 июля 2015 г., 23:48:21 UTC+3 пользователь Ben Noordhuis написал:
>
> On Wed, Jul 8, 2015 at 5:30 PM, Juggle <[email protected] <javascript:>>
> wrote:
> > Hi.
> >
> > I'm trying to develop nodejs module on C++ using v8.
> >
> > Here is source code.
> >
> > #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)
> >
> >
> > And then testing it with js code:
> >
> > 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);
> >
> >
> > Every function have different problems:
> >
> > **TestContext1** works fine but accessing global context and shutting
> down
> > process.
> >
> > **TestContext2** does not have access to global context but gives memory
> > leaks.
> >
> > All what I need - execute js script in isolated context without memory
> > leaks.
> >
> > node vm doesn't work because vm.runInNewContext() have same memory
> leaks.
> >
> > Does anybody have some ideas?
>
> Sample 1 is unsafe because you're passing a value from one isolate to
> another. Don't do that, it won't work.
>
> Sample 2 may benefit from calling
> isolate->ContextDisposedNotification() and, possibly,
> isolate->LowMemoryNotification(), but it won't help when complex
> values like arrays and objects from the temporary context escape to
> the main context. JS objects retain references to things like their
> constructors and prototypes, which in turn retain references to their
> constructors and prototypes, etc. You quickly end up retaining most
> of the context.
>
--
--
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
---
You received this message because you are subscribed to the Google Groups
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.