【问题标题】:Node.js buffer garbage collectionNode.js 缓冲区垃圾回收
【发布时间】:2016-08-17 11:46:17
【问题描述】:

buf.slice([start[, end]])

返回一个新的 Buffer,它引用与原始内存相同的内存,但偏移并被开始和结束索引裁剪。

注意修改新的Buffer slice会修改原Buffer中的内存,因为两个对象分配的内存重叠。

如果其中一个引用消失了,垃圾收集器如何处理分配的内存?

【问题讨论】:

    标签: node.js garbage-collection buffer


    【解决方案1】:

    当您对 Buffer 执行切片时,您只是创建了对原始缓冲区的新引用,该引用在不同的点开始和结束。

    如果更改原始缓冲区,切片引用也会更改。

    这意味着在所有引用(切片或未切片)都消失之前,整个内存块将无法用于垃圾回收。

    希望这能回答你的问题。

    【讨论】:

    • 谢谢,我假设切片缓冲区将保留整个最初分配的内存,但仅使切片部分可用。
    【解决方案2】:

    来自 Node.js 缓冲区文档:“Buffer#slice() 的实现在不复制的情况下创建了一个 现有 Buffer 的视图,使 Buffer#slice() 更加高效。”。这意味着缓冲区引用相同的内存位置导致重叠。只有在删除所有对缓冲区的引用后,垃圾收集器 (gc) 才能重新分配内存。当 gc 运行时,它会删除没有引用的缓冲区,并将内存返回到相应的池中。

    节点缓冲区的行为取决于您如何初始化它们。如果您使用了新的 Buffer() 方法,它们现在已被弃用,应该重新访问文档。您应该使用缓冲区 alloc()、bufferUnsafe() 和 bufferUnsafeSlow() 方法。

    【讨论】: