Javascript 不同类型的变量作用域是否会导致NodeJ内存泄漏?

Javascript 不同类型的变量作用域是否会导致NodeJ内存泄漏?,javascript,node.js,memory,memory-leaks,Javascript,Node.js,Memory,Memory Leaks,我的node js应用程序面临内存泄漏问题。我不能在这里发布代码,但我想知道这些事情是否会导致内存泄漏。这可能会帮助我知道我可能在哪里做错了什么: 函数中的局部变量: e、 g 现在,如果我在POSTroute中调用这个函数,它每次都会声明var foo。它是释放内存还是旧的var foo仍在某个地方保存内存?我是否需要在函数的最后一个语句中显式执行类似于foo=null的操作?(注意,这里foo是一个对象,我还想知道它是整数还是字符串) 我想说的是: app.post('/home', fun

我的node js应用程序面临内存泄漏问题。我不能在这里发布代码,但我想知道这些事情是否会导致内存泄漏。这可能会帮助我知道我可能在哪里做错了什么:

  • 函数中的局部变量:
  • e、 g

    现在,如果我在POSTroute中调用这个函数,它每次都会声明
    var foo
    。它是释放内存还是旧的
    var foo
    仍在某个地方保存内存?我是否需要在函数的最后一个语句中显式执行类似于
    foo=null
    的操作?(注意,这里foo是一个对象,我还想知道它是整数还是字符串)

    我想说的是:

    app.post('/home', function (req, res) {
        Foo();
        res.end();
    });
    
  • 路线
  • 这可能类似于1号,但我仍然想知道:

    app.post('/home', function (req, res) {
        var foo2 = 5;
        res.write("Something");
        res.end();
    });
    
    对于每个请求,我是否需要这样做:

    app.post('/home', function (req, res) {
        var foo2 = 5;
        res.write(foo2);
        foo2 = null;
        res.end();
    });
    
    或者它会自动释放它

  • 如果您看到第二点,
    req
    在此未使用。我是否还需要null或(类似这样的)它来防止内存泄漏

  • 全局变量:

    var globalVar=5; 应用程序post('/home',功能(请求、回复){ glbalVar=globalVar+1; res.write(“某物”); res.end(); });

  • 这里,4和2之间的唯一区别是变量的范围。我是否需要null此变量或重写自身以释放内存

    编辑:

    根据建议,我阅读了T.J.Crowder关于原始问题的另一个答案。这让我明白了一些事情,但我仍然对我的第3点和第4点有疑问。在3中,
    req
    对象不是我创建的,所以我是否需要它使
    null
    ?在4中,变量是全局变量。它会跟T.J.说的一样吗

    现在,当一些事情被清除后,我在这里添加了另一种情况,即我在脚本中使用的,具有以下异步代码块:

    apnProvider.send(note, deviceToken).then( (result) => {
      // see documentation for an explanation of result
    });
    
    我是这样称呼的:

    app.post('/home', function (req, res) {
        var data = {foo: req.body.bar};
        // above object has all data required to send push notification
        sendNotification (data);
        res.end();
    });
    
    function sendNotification(data){
      //other lines of code
      //I use data to get note, deviceToken
      apnProvider.send(note, deviceToken).then( (result) => {
          console.log(result);
      });
    }
    

    现在我的另一个问题是:这是T.J.所说的闭包的例子吗?由于在等待notification async函数的响应之前,我已经结束了
    res
    ,因此此关闭(如果是)是否会导致内存泄漏,因为它会保存我的
    数据
    对象?

    您能否准确指出导致内存泄漏的原因-例如堆快照或分配配置文件/时间线?一个变量不是原因。我现在要结束它;如果你还需要什么,请和/或打电话给我。@Bergi我将首先尝试另一个答案,看看它是否能澄清我的疑问。如果需要,我会编辑它,并在这里通知您。Re#3:谁创建了
    req
    引用的对象并不重要。重要的是:对它的任何引用都存在吗?如果是,则对象未被清理(某些对象仍在使用它)。如果不是,那就是。无论您是否将
    req
    设置为
    null
    ,这都无关紧要,因为
    req
    是一个参数,当函数返回时会被清除,除非您在回调中创建一个闭包,该闭包在回调返回后仍然存在。Re#4:只要模块存在,变量
    globalVar
    就会存在(它不是全局的,它是模块全局的)。我不认为节点中的模块会卸载,但我不确定。如果卸载了模块,则分配给模块的内存(包括
    globalVar
    )会被回收。
    app.post('/home', function (req, res) {
        var data = {foo: req.body.bar};
        // above object has all data required to send push notification
        sendNotification (data);
        res.end();
    });
    
    function sendNotification(data){
      //other lines of code
      //I use data to get note, deviceToken
      apnProvider.send(note, deviceToken).then( (result) => {
          console.log(result);
      });
    }