我的应用程序使用回调创建了很多函数,这是通过以下方式完成的:
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(并且越来越大,越来越大),或者更糟糕的是,我的实际功能没有得到清理(不再使用时)。
完成后如何删除信息或实际功能?
答案 0 :(得分:1)
您尝试过while(!V8::IdleNotification()) {};
吗?
{8)的noscript_shared_function_infos
是否应该由GC处理?
我有同样的问题,但在新上下文中使用Script :: Run。好像每次使用具有function ...() {}
的脚本调用时,它都会向noscript_shared_function_infos
WeakRef Array附加一些字节,然后再从不对其进行清理。
我在不同的平台(例如that)上只发现了一些问题,而对v8熟悉的人的回答为零。真伤心。