SlowBuffer类


返回一个不被池管理的 Buffer 。

为了避免创建大量独立分配的 Buffer 带来的垃圾回收开销,默认情况下小于 4KB 的空间都是切割自一个较大的独立对象。这种策略既提高了性能也改善了内存使用,因为 V8 不需要跟踪和清理很多 Persistent 对象。

当开发者需要将池中一小块数据保留不确定的一段时间,较为妥当的办法是用 SlowBuffer 创建一个不被池管理的 Buffer 实例并将相应数据拷贝出来。

  1. // need to keep around a few small chunks of memory
  2. const store = [];
  3. socket.on('readable', () => {
  4. var data = socket.read();
  5. // allocate for retained data
  6. var sb = SlowBuffer(10);
  7. // copy the data into the new allocation
  8. data.copy(sb, 0, 0, 10);
  9. store.push(sb);
  10. });

SlowBuffer 应该仅作为开发者已经观察到他们的应用保留了过度的内存时的最后手段。

new SlowBuffer(size)

  • size {Number}

分配一个 size 字节大小的新 SlowBuffersize 必须小于等于 require('buffer').kMaxLength(在64位架构上 kMaxLength 的大小是 (2^31)-1)的值,否则将抛出一个 RangeError 的错误。如果 size 小于 0 将创建一个特定的 0 长度(zero-length )的 SlowBuffer。

SlowBuffer 实例的底层内存是没被初始化过的。新创建的 SlowBuffer 的内容是未知的,并可能包含敏感数据。通过使用 buf.fill(0) 将一个 SlowBuffer 初始化为零。

  1. const SlowBuffer = require('buffer').SlowBuffer;
  2. const buf = new SlowBuffer(5);
  3. console.log(buf);
  4. // <Buffer 78 e0 82 02 01>
  5. // (octets will be different, every time)
  6. buf.fill(0);
  7. console.log(buf);
  8. // <Buffer 00 00 00 00 00>