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

概观

过去我已经对JavaScript内存pipe理进行了一些阅读,并且意识到了循环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的生命周期是npm_moduleA 它是在服务器启动的时候创build的,但是什么时候(如果有的话,GC会对它进行攻击) – 我猜测它永远不会被触及,因为它在全局范围内?

  2. 在'/ api / bar /'中,应该在每次请求后删除npm_moduleB 还是应该把这个留给GC呢?

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


参考

  • JavaScript内存pipe理
  • JavaScript中的内存泄漏模式
  • 什么是JavaScript垃圾收集?
  • Backbone.js和JavaScript垃圾收集

由于node.js不会为每个调用创build和销毁正在运行的上下文,所以npm_moduleAnpm_moduleB都将存在(在caching中)直到您npm_moduleB服务器。

事实上,不pipe你需要哪个模块,它只是获得一个指向模块入口点的指针。 它在运行时没有任何事情。

这里是一个例子:

index.js

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

module.js

 module.exports = {}; 

控制台输出:

 10 

在这种情况下,只需将您的require()在全局范围内一次即可。 不要求在callback中,因为require()有一些文件名parsing工作要做,而且与全局范围的require(在任何方面)没有区别。

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