【问题标题】:Efficient server-side JavaScript memory management in an express/node.js APIexpress/node.js API 中的高效服务器端 JavaScript 内存管理
【发布时间】:2012-05-18 18:14:30
【问题描述】:

概述

我过去读过一些关于 JavaScript 内存管理的文章,并且知道循环 DOM 引用等问题。

但是我仍然有点不舒服,因为这会转换为服务器端 JavaScript 环境,例如 node.js,更具体地说是在 express 上编写的 API。


获取这个示例文件(我们称之为 server.js)

var npm_moduleA = require('npmA')({ someInitArg : 'blah' }),
    app = express.createServer();

app.get('/api/foo', function (req, res) {

    var result = npm_moduleA.doSomething();
    res.send(result);

});

app.get('/api/bar', function (req, res) {

    var npm_moduleB = require('npmB')({ someInitArg : 'blah' }),
        result = npm_moduleB.doSomethingElse();

    res.send(result);

});

问题(假设这是一个高负载站点)

  1. npm_moduleA 的生命周期是什么? 它是在服务器启动的那一刻创建的,但是什么时候(如果有 GC 对它起作用)- 我是猜测它永远不会被触及,因为它在全球范围内?

  2. 在 '/api/bar/' 中,是否应在每次请求后删除 npm_moduleB 还是应该将其留给 GC 单独处理。

  3. npm_moduleA 的全局实例化是否比npm_moduleB 的重复实例化(和可能的删除)效率显着提高?


参考文献

【问题讨论】:

    标签: javascript node.js memory-management express


    【解决方案1】:

    由于 node.js 不会为每个调用创建和销毁运行上下文,因此npm_moduleAnpm_moduleB 都将存在(在缓存中),直到您终止服务器。

    事实上,无论你在哪里需要模块,它都只是获得一个指向模块入口点的指针。它不会在运行时实例化任何东西。

    这是一个例子:

    index.js

    var t = require('./module.js');
    t.value = 10;
    
    function test() {
      var t2 = require('./module.js');
      console.log(t2.value);
    }
    
    test();
    

    模块.js

    module.exports = {};
    

    控制台输出:

    10
    

    在这种情况下,只需将你的 require()s 放在全局范围内一次。不要在回调中做 requires,因为 require() 有一些文件名解析工作要做,它与全局范围内的 require 没有区别(在任何方面)。

    但如果你要实例化一个类 new SomeClass(),那么你在哪里做很重要。

    【讨论】:

    • 感谢您的回复-您在示例代码中突出显示了一个错误...我的要求还应该显示一个类的实例化(所以 require('blah')(/* some init args */) 而不是只需要源文件)。我已经更新了我的代码,这可能会影响你的一些答案
    • @beardtwizzle:我的观点仍然成立,无论您在哪里需要某些东西,它都会返回一个指向缓存条目的指针。如果您要使用在模块中导出的函数,它将存在于缓存中,并且在服务器死亡之前不会被释放。
    • @beardtwizzle: -- 继续,如果你有一个静态初始化参数,并且该函数可以在请求期间共享,那么只需将实例保留为全局。它应该有更好的性能,并且您可以想象内存使用量在任何时候都是恒定的(由于请求是串行响应的,请尽量不要关闭连接,那么将不会为其他客户端提供服务)。如果你的服务器真的很热,第二种模式会因为创建/销毁对象而出现一些性能问题,并且你不能节省大量的内存使用。
    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 2013-03-28
    • 2016-12-28
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多