express/node.js API中高效的服务器端JavaScript内存管理 概述
我在过去读过一些关于JavaScript内存管理的书,并且知道循环DOM引用的问题,等等 然而,我仍然有点不舒服,因为这会转化为服务器端JavaScript环境,比如,更具体地说,是一个编写在其上的APIexpress/node.js API中高效的服务器端JavaScript内存管理 概述,javascript,node.js,memory-management,express,Javascript,Node.js,Memory Management,Express,我在过去读过一些关于JavaScript内存管理的书,并且知道循环DOM引用的问题,等等 然而,我仍然有点不舒服,因为这会转化为服务器端JavaScript环境,比如,更具体地说,是一个编写在其上的API 以这个示例文件为例(我们称它为server.js) 问题(假设这是一个高负载站点) npm_moduleA的生命周期是什么?它是在服务器启动时创建的,但是当(如果GC真的反对它的话)我猜它永远不会被触及,因为它在全局范围内 在“/api/bar/”中,是否应在每次请求后删除npm_模块b?还
以这个示例文件为例(我们称它为server.js) 问题(假设这是一个高负载站点)
npm_模块b
?还是应将其单独留给GCnpm_模块a
是否比重复实例化npm_模块b
更有效?工具书类
npm_moduleA
和npm_moduleB
将一直存在(缓存中),直到您杀死服务器
事实上,无论您在哪里需要模块,它都只会得到一个指向模块入口点的指针。它不会在运行时引用任何东西
以下是一个例子:
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()放在全局范围内一次。不要在回调中执行requires,因为require()有一些文件名解析工作要做,并且它与全局范围中的require(在任何方面)没有区别
但是,如果您要实例化一个类
new SomeClass()
,那么在何处执行它很重要。感谢您的回复-您在示例代码中突出显示了一个错误。。。假设我的requires还显示类的实例化(因此require('blah')(/*一些init args*/)
,而不仅仅需要源文件)。我已经更新了我的代码,这可能会影响您的一些answer@beardtwizzle:我的观点仍然成立,无论您需要什么,它只返回指向缓存项的指针。如果要使用在模块中导出的函数,它将存在于缓存中,并且在服务器死亡之前不会被释放。@BeardWizzle:--继续,如果您有静态初始化参数,并且该函数可以在请求期间共享,则只需将实例保留为全局。它应该具有更好的性能,您可以想象内存使用在任何时候都是恒定的(因为请求是以串行方式响应的,请尝试不关闭连接,这样就不会为其他客户端提供服务)。如果您的服务器非常热,那么第二种模式将由于创建/销毁对象而出现性能问题,并且您无法节省大量内存使用。
10