在我的工作中,我们有很多可以从 Node.JS 通过本机扩展调用的 C++ 代码。许多创建的对象包含指向大量内存的指针(例如,来自 3D 相机的点云数据指向大小超过 1 兆字节的缓冲区)。事情已经以这样一种方式设置,当 JS 对象被 GC'ed 时,底层的本地对象也应该被销毁(通过使用我们自己的引用计数器在引擎盖下)。昨天事实证明,它并没有像我们想象的那么好,因为我们每秒泄漏大约 1 兆字节而耗尽了内存。
不幸的是,我无法找到有关如何在 Node.JS 中正确处理这些大型对象的信息。我找到了一个名为的函数napi_adjust_external_memory
,它可以让我知道有多少数据正在使用,以及“将比其他情况更频繁地触发全局垃圾收集”,但我不知道如果没有其他部分是否可以使用使用 N-API。我不清楚 OOM 错误是由我们的 C++ 代码库中的错误引起的,还是 Node.JS 错误地假设它使用的内存比实际使用的内存少,因此没有为这些对象触发 GC。
所以,总而言之,我的问题如下:
尽管存在内存压力,这些对象是否可能从未被收集?
我可以使用 napi_adjust_external_memory 更频繁地触发 GC 而不使用 N-API 的其他部分吗?
我应该如何处理 Node.JS 中的大型原生对象以确保它们不会泄漏?