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); });
问题(假设这是一个高负荷的网站)
-
npm_moduleA
的生命周期是npm_moduleA
? 它是在服务器启动的时候创build的,但是什么时候(如果有的话,GC会对它进行攻击) – 我猜测它永远不会被触及,因为它在全局范围内? -
在'/ api / bar /'中,应该在每次请求后删除
npm_moduleB
? 还是应该把这个留给GC呢? -
npm_moduleA
的全局实例是否比重复npm_moduleB的实例化(以及可能的删除)更有效?
参考
- JavaScript内存pipe理
- JavaScript中的内存泄漏模式
- 什么是JavaScript垃圾收集?
- Backbone.js和JavaScript垃圾收集
由于node.js不会为每个调用创build和销毁正在运行的上下文,所以npm_moduleA
和npm_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()
类,那么你在哪里做的事情很重要。