V8垃圾收集非常慢

时间:2015-02-05 13:59:49

标签: c++ multithreading embed v8

我开发了一个实时3D引擎,现在我想切换到V8 JavaScript引擎。实施非常简单,一切都很好,除了我有垃圾收集问题,它会导致重要的性能泄漏。由于技术原因,我需要积极的垃圾收集,所以我收集垃圾:

v8 :: V8 :: LowMemoryNotification();

哪能做我想要的,但很慢。我也尝试过:

V8 :: IdleNotification();

然后垃圾收集会在真正执行时导致长时间中断。

在实时3D应用程序中实现V8垃圾收集的最佳方法是什么,我该如何思考?多线程怎么样?

似乎很重要的是,3D场景可以有脚本,每个脚本都在一个单独的隔离区中运行。

1 个答案:

答案 0 :(得分:0)

让每个脚本在单独的Isolat e中运行可能不是您想要的。您应该考虑共享一个Isolate,而只是将它们与单独的Context分开。

您还应该在自己的专用线程上运行JavaScript,使用适当的本机IPC机制与您的用户线程进行通信。然后,执行垃圾收集的适当方法是定期使用v8::IdleNotification()(并且当您合法地耗尽内存时仅调用v8::LowMemoryNotification()),并简单地限制它有多长时间可以花在它上面。如果您需要为游戏逻辑添加其他线程,则每个线程可以有一个Isolate,并以这种方式拆分Context(尽管如果这样做,您将无法在线程之间迁移脚本)。

还有一个更新的API用于运行“微任务”,这可能适合您的需求,尽管截至2015年2月它仍然是实验性的。

当然,确保您的脚本首先生成尽可能少的垃圾。避免在每帧的基础上创建新对象,包括被它们包围的函数和局部变量。另外,尝试预先在一个属性包中预先分配您的所有状态。这样做可以减少首先需要收集的垃圾量。