我的应用程序使用回调创建了许多函数,这是通过以下方式完成的:
v8::Local<v8::Function> myFunc = v8::Function::New(
i->GetCurrentContext(),
FunctionInvokerCallback(),
this->WrapDelegate(callbackInvoke),
0,
v8::ConstructorBehavior::kThrow,
v8::SideEffectType::kHasSideEffect).ToLocalChecked();
//persistentObject is a weak Global reference with a callback to clean up native resources
this->objectHandle->persistentObject->Get(i)->Set(i->GetCurrentContext(), functionName, myFunc).FromJust();
内存增加,最终出现OOM错误并崩溃。查看堆快照后,我发现大多数保留的内存由noscript_shared_function_infos保留在(强根)中。
我的猜测是或者不对sharedFunctionInfos进行清理(并且不停地增长),或者更糟糕的是,当不使用时,我的实际功能也没有得到清理。
完成后如何删除信息/或实际功能?
最佳答案
您尝试过while(!V8::IdleNotification()) {};
吗?
v8的GC不应该处理noscript_shared_function_infos
吗?
我有同样的问题,但在新上下文中使用Script::Run。好像每次使用具有function ...() {}
的脚本调用时,它都会向noscript_shared_function_infos
WeakRef Array附加一些字节,然后再对其进行清理。
我在不同平台(例如that)上只发现了一些问题,而对v8熟悉的人的回答为零。这是可悲的。
关于c++ - 内存不足,所有保留的内存都由noscript_shared_function_infos保留,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57113516/