Nodejs / V8如何知道原生对象有多大?

时间:2017-12-18 08:58:33

标签: node.js opencv matrix garbage-collection

具体来说,在node-opencv中,opencv Matrix对象表示为包装c ++ opencv Matrix的javascript对象。

但是,如果你不手动发送它们,那么V8引擎似乎不知道它们有多大,并且NodeJS内存占用量可能远远超出你试图在命令上设置的任何限制线;即它只是在接近设定的内存限制时似乎只运行GC,但由于它没有看到对象那么大,所以直到它太晚才会发生。

我们可以添加一些东西,让V8将它们视为大对象吗?

说明这一点,你可以创造并忘记' nodejs上的大型1M缓冲区设置为将其内存限制为256Mbytes。

但是如果你对1M opencv Matrices做同样的事情,NodeJS会快速使用超过256M的限制 - 除非你手动运行GC,或者手动释放矩阵。

(警告:c ++ opencv矩阵是对内存的引用;即多个Matrix对象可以指向相同的数据 - 但是让V8看到对同一内存的所有引用的大小都是一个开始为了GC的目的,那个内存更安全,看起来非常小。)

情况:在RPi3上,我们的内存占用有限,处理实时视频(每帧使用大约4M的mat对象)很快就会耗尽所有内存。 此外,我工作的环境(节点 - 红色节点)是为公共场所设计的。使用,所以很难确保所有用户完全理解需要手动.release()图像;因此,这个问题是关于如何将这些大数据置于GC的控制之下。

1 个答案:

答案 0 :(得分:0)

您可以使用AdjustAmountOfExternalAllocatedMemory(int64_t delta)告知v8您的外部存储器使用情况。 n-apiNAN中有此功能的包装。


顺便说一句,“大对象”在v8中具有特殊含义:大到足以在大对象空间中创建且永不移动的对象。外部存储器是堆外存储器,我想您在指的是什么。