【发布时间】:2016-08-17 11:46:17
【问题描述】:
buf.slice([start[, end]])
返回一个新的 Buffer,它引用与原始内存相同的内存,但偏移并被开始和结束索引裁剪。
注意修改新的Buffer slice会修改原Buffer中的内存,因为两个对象分配的内存重叠。
如果其中一个引用消失了,垃圾收集器如何处理分配的内存?
【问题讨论】:
标签: node.js garbage-collection buffer
buf.slice([start[, end]])
返回一个新的 Buffer,它引用与原始内存相同的内存,但偏移并被开始和结束索引裁剪。
注意修改新的Buffer slice会修改原Buffer中的内存,因为两个对象分配的内存重叠。
如果其中一个引用消失了,垃圾收集器如何处理分配的内存?
【问题讨论】:
标签: node.js garbage-collection buffer
当您对 Buffer 执行切片时,您只是创建了对原始缓冲区的新引用,该引用在不同的点开始和结束。
如果更改原始缓冲区,切片引用也会更改。
这意味着在所有引用(切片或未切片)都消失之前,整个内存块将无法用于垃圾回收。
希望这能回答你的问题。
【讨论】:
来自 Node.js 缓冲区文档:“Buffer#slice() 的实现在不复制的情况下创建了一个 现有 Buffer 的视图,使 Buffer#slice() 更加高效。”。这意味着缓冲区引用相同的内存位置导致重叠。只有在删除所有对缓冲区的引用后,垃圾收集器 (gc) 才能重新分配内存。当 gc 运行时,它会删除没有引用的缓冲区,并将内存返回到相应的池中。
节点缓冲区的行为取决于您如何初始化它们。如果您使用了新的 Buffer() 方法,它们现在已被弃用,应该重新访问文档。您应该使用缓冲区 alloc()、bufferUnsafe() 和 bufferUnsafeSlow() 方法。
【讨论】: