【问题标题】:Understanding freelist了解freelist
【发布时间】:2012-11-29 02:12:30
【问题描述】:

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

制作销毁方法是非常危险的。我建议如果你是 担心这个然后你使用 require('freelist') 并尝试 使用后回收内存 - 这是我在 net.js 中所做的

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

【问题讨论】:

    标签: node.js


    【解决方案1】:

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

    为向量创建一个新的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 完成,通过一些巧妙的技巧再次调用构造函数进行初始化。

    【讨论】:

    • 谢谢mtsr。这看起来是正确的答案。但我现在看不懂这个答案。
    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2010-11-12
    • 2020-09-18
    • 2011-01-07
    • 2016-07-15
    • 2012-02-28
    相关资源
    最近更新 更多