堆内存,所有保留的内存由noscript_shared_function_infos持有

Heap out of memory, all retained memory held by noscript_shared_function_infos

本文关键字:内存 shared function infos 持有 noscript 有保留      更新时间:2023-10-16

我的应用程序使用回调创建了很多函数,这是通过以下方式完成的:

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 in(强根)持有。

我的猜测是,要么共享功能信息没有被清理(并且增长,增长和增长),或者更糟糕的是,我的实际功能没有被清理(当不再使用时)。

完成后如何删除信息/或实际功能?

你试过while(!V8::IdleNotification()) {};吗?noscript_shared_function_infos不应该由 v8 的 GC 处理吗?

我有同样的问题,但脚本::在新上下文中运行。似乎每次它调用具有function ...() {}的脚本时,它都会将一些字节附加到noscript_shared_function_infos弱参考数组,然后永远不会清理它。

我在不同的平台上只发现了一些问题(比如那个),而对 v8 非常了解的人的答案为零。很可悲。