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

express/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?还

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

然而,我仍然有点不舒服,因为这会转化为服务器端JavaScript环境,比如,更具体地说,是一个编写在其上的API


以这个示例文件为例(我们称它为server.js) 问题(假设这是一个高负载站点)
  • npm_moduleA的生命周期是什么?它是在服务器启动时创建的,但是当(如果GC真的反对它的话)我猜它永远不会被触及,因为它在全局范围内

  • 在“/api/bar/”中,是否应在每次请求后删除
    npm_模块b
    还是应将其单独留给GC

  • 全局实例化
    npm_模块a
    是否比重复实例化
    npm_模块b
    更有效?


  • 工具书类

    由于node.js不会为每个调用创建和销毁运行上下文,因此
    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