-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
在引入TypedArray之前,JavaScript没有读取或操作二进制数据流的机制。Buffer类用于在TCP流或文件系统操作等场景中处理字节流。现在有了TypedArray,Buffer类以一种更优化、更适合Node.js的方式实现了Uint8Array。
Buffer类的实例类似于整数数组,但Buffer的大小是固定的、且在V8堆外分配物理内存。Buffer的大小在创建时确定,且无法改变。Buffer类是一个全局变量,使用时无需require('buffer).Buffer。
Buffer模块结构
buffer是一个典型的js和C++结合的模块,它的性能部分是由C++实现的,非性能部分是由js实现。
Buffer对象
Buffer是一个类数组的对象,它的元素是16进制的两位数,即0-255,因为它是个类数组,所以可以通过数组的方法去操作它,也可以通过数组的方式取值赋值,当给其赋值的值不在0-255之间时,遵循以下原则:
给元素赋值如果小于0,将该值依次加256,知道符合要求,如果值大于255,则依次减256,直到符合要求,如果是小数,则舍弃小数部分,只取整数部分。
Buffer内存分配
Buffer对象的内存不是在V8的堆内存中,而是在Node的C++层面申请的。为了更高效的使用内存,Node采用了slab动态内存管理机制。
简单说,slab是一块申请好的固定的内存区,它有3种状态:
- Full:完全分配状态
- Partial:部分分配状态
- Empty:没有被分配状态
当我们要使用buffer时,可以通过以下的方式来指定Buffer对象的大小:
const buf = Buffer.alloc(10);
Node是以8KB来区分Buffer对象是大对象还是小对象。
Buffer.poolSize = 8 * 1024;
从这里可以看出buffer类数组的一位对应的就是1byte。
Metadata
Metadata
Assignees
Labels
No labels