Node.js缓冲区数据在幕后是如何存储的?

14
根据Node JS缓冲文档,"缓冲区类似于整数数组,但对应于V8堆之外的原始内存分配"。没有提供进一步的信息。
问题是数据在RAM中如何存储。Node JS缓冲区是否使用特殊的方式在堆上分配空间?这是否受到与V8堆相同的垃圾回收的影响?我可以安全地假设缓冲区中数据的任何更改实际上都会更改RAM中的数据,并且没有留下数据的残留物供窥探者使用吗?
非常抱歉问得太笼统,但似乎找不到有关实际工作原理的任何材料。我之所以问这个问题,是因为我想确保我应用程序中使用的变量不会在内存中停留的时间比需要的时间长。

Docs: https://nodejs.org/api/buffer.html#buffer_class_buffer

干杯!


@jfriend00 你应该把那个作为答案留下来。 - mscdex
参见:Node.js 缓冲区存储在哪里? - user56reinstatemonica8
1个回答

11
实现缓冲区的nodejs源代码在http://github.com/joyent/node/blob/master/lib/buffer.jshttp://github.com/joyent/node/blob/master/src/node_buffer.cc。如果您真的想了解它的工作原理,您可以研究实际的代码。
至于您的问题...
问题是数据如何存储在RAM中。Node JS缓冲区是否使用特殊的方式在堆上分配空间?
根据源代码,内存分配给缓冲区对象涉及到堆分配和内存池。具体使用哪一个取决于其用法的细节。
它是否受V8堆同样的垃圾回收机制限制?
是的,垃圾回收也适用于缓冲区对象。如果使用本地代码实现对象并遵循其实现中的严格一组规则,则这些对象可以参与垃圾回收。
我可以安全地假设缓冲区中的任何数据更改都会实际更改RAM中的数据,并且没有数据的残留剩余供窃听者查看吗?
是的,当您更改缓冲区中的数据时,它实际上更改了RAM中的数据(除非它仅存储在磁盘上,但这不是情况)。至于“没有数据的残留剩余供窃听者查看”,那很难说。在编程中很常见的是,当堆元素或池元素增长或缩小时,它们的数据可能会被复制到另一个RAM块中,而旧的、现在被释放或回收的RAM块可能仍然有一份或全部原始数据的副本。除非经过特别清除,否则新分配的RAM极有可能被用于其他用途,并且仍然可能包含来自先前使用的信息。
另一方面,写入Buffer对象会直接写入分配/分配给该Buffer对象的RAM(只要您不导致其大小改变),因此如果您想减少数据在RAM中残留的概率,则可以在完成后覆盖Buffer对象中的数据。

太棒了!谢谢伙计! - Axel Ericsson
那么,缓冲区内容不存储在堆栈上,而是存储在单独的专用内存池中,其大小计入常驻集总分配的一部分?或者缓冲池是堆栈的一部分吗? - user56reinstatemonica8
@user568458 - 缓冲池不在堆栈上,而是来自堆。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接