我的应用程序创建了很多带有回调的函数,这是通过以下方式完成的:
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()) {};
?
noscript_shared_function_infos
不应该由 v8 的 GC 处理吗?
我有同样的问题,但 Script::Run 在新的上下文中。似乎每次调用具有 function ...() {}
的脚本时,它都会将一些字节附加到 noscript_shared_function_infos
WeakRef 数组,然后永远不会清除它。
我在不同的平台上只发现了一些问题(比如 that ),而从熟悉 v8 的人那里得到的答案为零。很难过。
关于c++ - Heap out of memory,noscript_shared_function_infos持有的所有保留内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57113516/