1

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

制作销毁方法是非常危险的。我建议如果您对此感到担忧,那么您可以使用 require('freelist') 并在使用后尝试回收内存 - 这就是我在 net.js 中所做的

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

4

1 回答 1

7

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

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

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

释放不再需要的向量:

vectorsList.free(vector);

就是这样。

需要注意的一件非常重要的事情:尽管我已经在上面编写了将来自 alloc 调用的参数传递给向量构造函数的内容,但这在列表中没有可用向量的情况下才会发生。否则你只会得到第一个可用的向量,仍然用它在构造时的任何参数构造。

如果您想真正干净地初始化每个对象,您可能不应该将对象的初始化放入构造函数中,而是放入 init 函数中,在从 freelist 中获取对象后始终调用该函数。

当然,这可能通过 freelist 来完成,并通过一些巧妙的技巧再次调用构造函数进行初始化。

于 2012-12-04T14:13:05.500 回答