Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all articles
Browse latest Browse all 14821

Buffer模块的内存分配。

$
0
0

一、Buffer模块简介 * Buffer模块是JavaScript和C++结合的模块。性能部分由C++实现,非性能部分由JavaScript实现。 * Buffer所占的内存不是由V8分配,其内存属于堆外内存。 * Buffer模块位于全局变量global中,启动node的时候就已经加载了,无需通过require语句来加载。 * Buffer类似于数组,其每个元素是16进制的2位数(0-255)。 * Buffer应用于二进制的数据较多,如图片、音频、文件、流…

tip:给Buffer中的某个元素进行赋值 -----如果所赋的值是0-255之间,直接赋值 -----如果所赋的值是不在0-255之间,则通过 +/-n*256使值在0-255之间,再进行赋值 -----如果所赋的值是小数,则取整之后再进行赋值。

二、Buffer的内存分配 Buffer对象的内存不是由V8进行分配的,由Node的C++层面向操作系统申请的。 因为在进行处理大量的字节数据时,不能需要一点内存就向操作系统申请一点内存,这样会造成大量的内存申请的系统调用,会对操作系统造成压力。因此在Buffer上,Node在C++层面申请内存,JavaScript分配内存。

JavaScript分配内存策略:采用动态的内存分配策略,slab分配机制。slab就是申请好的固定大小的内存区域。其有3中状态:完全分配状态;部分分配状态;未分配状态。

Buffer对象的大小区分:8KB及8KB以下属于小Buffer对象;8KB以上属于大Buffer对象。 对于大Buffer对象和小Buffer对象,JavaScript的内存分配是不同的。 小Buffer对象内存分配机制: Buffer的分配过程,主要使用一个局部变量pool作为中间处理对象,处于分配状态的slab单元都指向它。以下代码是分配一个全新的slab单元的操作。 var pool; function callPool(){ pool = new SlowBuffer(Buffer.poolsize); 下面会对SlowBuffer做出解释 pool.used = 0; } var buffer = new Buffer(1024); 第一次创建一个Buffer对象,内存示意图 Image.png var buffer2 = new Buffer(3000);第二次创建一个Buffer对象,内存示意图 Image.png在二次创建一个Buffer对象时,如果在已有的slab中有足够大的内存空间,则直接在已有的pool中分配。如果已有的slab的剩余内存空间不够大,则会构造新的slab(这样会造成内存浪费)。

分配大的Buffer对象(超过8KB): 对于创建大的Buffer对象,将会直接分配一个SlowBuffer对象作为slab单元。SlowBuffer类是C++中定义的。


Viewing all articles
Browse latest Browse all 14821

Trending Articles