请教Buffer的GC机制?
发布于 7 年前 作者 laoqiren 4860 次浏览 来自 问答

Buffer内存为V8堆外分配,那么它是如何被回收的?回收机制是怎样的?

9 回复

和普通对象一样,在没有对buffer引用时回收 准确的说是引用buffer的变量全部被回收时,buffer会被回收

和普通对象一样,在没有对buffer引用时回收 准确的说是引用buffer的变量全部被回收时,buffer会被回收

跟普通的对象一样, 只是buffer本身, 不会占用V8的堆栈内存,

谢谢

Buffer 有多种方式生成(我指在底层)。一种方式是你传入内存块,它另开辟一块内存把你的内容拷贝进去,你仍然要对你自己的内存区域负责(指在 C++ 扩展上调用的时候)。还有一种是,你传入的内存块它直接用,并且在 Buffer 生命周期到的时候(即被 GC),触发一次 free() 操作。

@xadillax 据我了解,貌似Buffer的内存分配都是堆外分配吧,不管是C++直接分配还是slab方式,就算是传入ArrayBuffer这种来生成Buffer,也是直接共用ArrayBuffer的内存,Buffer有关的内存对于用户层面来说都只是对堆外内存的引用而已。V8的GC对这些内存来说应该不起作用吧,谢谢指教。

@laoqiren V8 GC 的确对其不直接起作用。正如我所讲,Buffer 对象被 GC 的时候会触发一个回调(C++ 层面的回调),而 Node.js 源码中定义的那个回调里面做的事就是释放那块内存。

@xadillax 谢谢,大概知道怎么回事儿了。

回到顶部