buf.slice([start [,end]])
返回一个新的Buffer,它引用与原始内存相同的内存,但是偏移并由起始和结束索引裁剪。
请注意,修改新的Buffer slice会修改原始Buffer中的内存,因为两个对象的已分配内存重叠。
如果其中一个引用消失了,垃圾收集器如何处理已分配的内存?
答案 0 :(得分:2)
当您在Buffer上执行切片时,您只是创建一个对原始缓冲区的新引用,该引用在不同的点开始和结束。
如果更改原始缓冲区,切片参考也将更改。
这意味着整个内存块都不可用于垃圾收集,直到所有引用(切片或不切片)都消失为止。
希望这能回答你的问题。
答案 1 :(得分:1)
来自Node.js缓冲区文档:“Buffer#slice()的实现在现有缓冲区上创建视图而不进行复制,从而使Buffer#slice()更加高效。”这意味着缓冲区引用相同的内存位置,从而导致重叠。只有删除了对缓冲区的所有引用后,才能通过垃圾收集器(gc)重新分配内存。当gc运行时,它将删除没有引用的缓冲区并将内存返回到相应的池中。
节点缓冲区的行为会有所不同,具体取决于您初始化它们的方式。如果您使用了新的Buffer()方法,则现在不推荐使用它们,并且应该重新访问文档。您应该使用缓冲区alloc(),bufferUnsafe()和bufferUnsafeSlow()方法。