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

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/

10-12 03:15
查看更多