根据Node JS Buffer Documentation,“缓冲区类似于整数数组,但对应于V8堆外部的原始内存分配”。没有提供进一步的信息。
问题是数据如何存储在RAM中。节点JS缓冲区是否使用在堆上分配空间的特殊方法?这是否与V8的堆相同?我可以安全地假设对缓冲区中数据的任何更改实际上都会更改RAM中的数据,并且没有剩余的数据残留给窥探者吗?
对于这个非常广泛的问题感到抱歉,但我似乎找不到任何关于它如何实际工作的材料。我问的原因是因为我想确保我在我的应用程序中使用的变量不会在内存中停留超过它们所需的时间。
文档: https://nodejs.org/api/buffer.html#buffer_class_buffer
干杯!
答案 0 :(得分:8)
用于实现缓冲区的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对象中的数据。