理解freelist

Alf*_*red 1 node.js

https://github.com/joyent/node/blob/master/lib/freelist.js

制作破坏方法非常危险.我建议如果你关心这个,那么你使用require('freelist')并尝试在使用后回收内存 - 这就是我在net.js中所做的

例如,它在https://github.com/joyent/node/blob/master/lib/http.js中使用,但我仍然没有完全得到它.如何使用这个模块的一个例子是甜蜜的.

mts*_*tsr 7

这是管理经常创建和销毁的对象的重用的非常简单的方法.当没有当前未使用的对象可用时,空闲列表仅创建新对象,减少内存占用而无需等待垃圾收集等.使用它涉及三个简单步骤:

为向量创建一个新的空闲列表(想要重用的虚构对象类型):

// Some type of object I want to be able to reuse
var Vector = require('./Vector');
// The freelist itself
var FreeList = require('freelist').FreeList;

// Arguments are (freelistName, maxSize, constructorForNewObjects)
var vectorsList = new FreeList('vectors', 1000, function() {
  // quick way to use constructor with arguments object
  return Vector.apply(Object.create(Vector.prototype), arguments);
});
Run Code Online (Sandbox Code Playgroud)

从空闲列表中获取新的向量:

var vector = vectorsList.alloc(/* optional arguments for the Vector constructor /*);
Run Code Online (Sandbox Code Playgroud)

释放不再需要的向量:

vectorsList.free(vector);
Run Code Online (Sandbox Code Playgroud)

而已.

需要注意的一件非常重要的事情:虽然我已经写过将alloc调用中的参数传递给向量构造函数,但只有在列表中没有可用的向量时才会发生这种情况.否则,您只需获得第一个可用的向量,仍然使用构造时的任何参数构建.

如果你想要干净地初始化每个对象,你可能不应该把对象的初始化放到构造函数中,而应该放在一个init函数中,你总是在从freelist获取一个对象之后调用它.

当然,这可能是由freelist进行的,有一些聪明的黑客攻击,再次调用构造函数进行初始化.