【8.23】nodejs 原理 - Buffer(1) - Buffer 的结构

534 阅读2分钟

这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战

前面的文章 内存指标(juejin.cn/post/699727… ) 讲到,nodejs 中 Buffer 的内存分配,不受 V8 堆内存大小限制,是在 nodejs 进程常驻内存中,除了 V8 堆内存,另外的一块内存空间。

我们在进行前端开发时,字符串的处理足以满足我们的开发需求,但是在后端开发中,我们需要操作数据库、处理图片、接收上传的文件,在网络流和文件流中,需要大量处理二进制数据,JavaScript 的字符串于是远不能满足需求,于是就有了 Buffer 对象~

Buffer 是一个像 Array 的结构,但是他主要用于操作字节

Buffer 模块结构

Buffer 是一个典型的 JavaScript 和 C++ 结合的模块,它的性能部分用 C++ 实现,非性能部分用 JavaScript 实现

image.png

前面提到了,Buffer 使用了单独的内存分配和回收机制,不受 V8 堆内存限制

Buffer 由于非常常见,nodejs 进程启动时就加载了,不需要单独引入

Buffer 对象结构

Buffer 对象类似于数组,它的元素是 16 进制的两位数

image.png

不同编码的字符串占用的元素个数各不相同,上面中文在 utf-8 编码下占用 3 个元素,字母和半角符号占用 1 个元素

Buffer 的内存分配

Buffer 的内存分配,不是在 V8 的堆内存中,是由 nodejs 在 C++ 层面实现内存的申请的。因为处理大量的字节数据,不能采用使用一点内存,就像操作系统申请一点的方式,这可能造成大量的内存申请,对操作系统产生压力,于是 nodejs 由 C++ 进行内存申请,JavaScript 进行内存分配。

当进行小而频繁的 Buffer 操作时,使用 slab 进制进行预先申请和事后分配,使得 JavaScript 到操作系统之间不需要过多内存申请方面的系统调用;对于大块的 Buffer,直接使用 C++ 层面提供的内存,不必进行细腻的分配操作。

以上为 Buffer 的结构介绍,欢迎点赞和评论~