理解freelist

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

制造销毁方法是非常危险的。 我build议,如果你担心这个,那么你使用require('freelist')并尝试回收内存使用它后 – 这是我在net.js

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

pipe理经常创build和销毁的对象的重用是非常简单的方法。 当没有当前未使用的对象可用时,freelist只创build新的对象,减less内存占用而不必等待垃圾收集等。使用它包括三个简单的步骤:

为向量创build新的freelist(想要重用的虚构对象types):

// 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); }); 

从freelist获取一个新的载体:

 var vector = vectorsList.alloc(/* optional arguments for the Vector constructor /*); 

释放不再需要的vector:

 vectorsList.free(vector); 

而已。

一个非常重要的事情要注意:虽然我已经写了上面的代码来将参数从alloc调用传递给vector构造函数,但是只有当列表中没有可用的向量才会发生这种情况 。 否则,你只要得到第一个可用的vector,它仍然是用施工时的任何参数构build的。

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

当然这可能可以通过freelist进行一些巧妙的黑客攻击,再次调用构造函数进行初始化。