如何在后台存储Node JS Buffer数据

How is Node JS Buffer data stored behind the scenes?

本文关键字:JS Buffer 数据 Node 存储 后台      更新时间:2023-09-26

根据Node JS Buffer文档," Buffer类似于整数数组,但对应于V8堆之外的原始内存分配"。没有给出进一步的信息。

问题是数据如何存储在RAM中。节点JS缓冲区是否使用一种特殊的方式来分配堆上的空间?这是否受到与V8的堆相同的垃圾收集?我是否可以安全地假设,对缓冲区中数据的任何更改实际上都会更改RAM中的数据,并且不会为窥探者留下残留的数据?

很抱歉,这个问题很宽泛,但我似乎找不到任何关于这实际上是如何工作的材料。我问这个问题的原因是因为我想确保我在应用程序中使用的变量不会在内存中停留的时间超过它们需要的时间。

文档:https://nodejs.org/api/buffer.html buffer_class_buffer

干杯!

nodejs实现缓冲区的源代码是http://github.com/joyent/node/blob/master/lib/buffer.js和http://github.com/joyent/node/blob/master/src/node_buffer.cc。如果你真的想知道它是如何工作的细节,你可以研究实际的代码。

关于你的问题……

问题是数据如何存储在RAM中。节点JS缓冲吗使用一种特殊的方式在堆上分配空间?

根据源代码,在分配给缓冲对象的内存中涉及堆分配和内存池。当每一个被使用取决于如何使用的细节。

是否受到与V8的堆相同的垃圾收集?

是的,垃圾收集对Buffer对象有效。使用本机代码实现的对象如果在实现中遵循一组严格的规则,则有可能参与垃圾收集。

我可以安全地假设对缓冲区中数据的任何更改实际上更改RAM中的数据,并且没有数据的残余留给偷窥者?

是的,当你改变缓冲区中的数据时,它实际上改变了RAM中的数据(除了RAM之外没有其他地方存储更改,除非它只存储在磁盘上,而不是这种情况)。

至于"没有数据残留给偷窥者",那就很难说了。在编程中,当堆元素或池元素增长或缩小时,它们的数据可能被复制到另一块RAM中,而旧的、现在释放或回收的RAM块可能仍然具有部分或全部原始数据的副本,这是非常常见的。除非特别清除,否则新分配的RAM很可能之前已经用于其他用途,并且可能仍然包含以前使用的信息。

另一方面,写入Buffer对象直接写入分配/分配给该Buffer对象的RAM(只要你不导致它的大小改变),所以如果你想减少你的数据将留在RAM中的几率,你可以覆盖你的Buffer对象中的数据当你完成它。