express/node.js API中的高效服务器端JavaScript内存管理

isN*_*247 11 javascript memory-management node.js express

概观

我过去已经对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);

});
Run Code Online (Sandbox Code Playgroud)

问题(假设这是一个高负荷的网站)

  1. 什么是生命周期npm_moduleA它能够在瞬间创建的服务器启动,但是当(如果有的话确实GC踢反对) -我猜测,它从来没有被感动,因为它在全球范围内?

  2. 在'/ api/bar /'中,npm_moduleB每次请求后都应该删除吗?或者这应该留给GC单独使用.

  3. 全局实例化是否npm_moduleA比重复实例化(以及可能的删除)明显更有效npm_moduleB


参考

xia*_*oyi 9

随着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();
Run Code Online (Sandbox Code Playgroud)

module.js

module.exports = {};
Run Code Online (Sandbox Code Playgroud)

控制台输出:

10
Run Code Online (Sandbox Code Playgroud)

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

但是如果你打算上课new SomeClass(),那么你做的事情很重要.