【问题标题】:Is there possibly a memory leak in the following node js code?以下节点js代码中是否可能存在内存泄漏?
【发布时间】:2015-07-18 20:26:38
【问题描述】:

我注意到以下节点 js 代码在运行时不断使用越来越多的内存。不确定 GC 何时/是否启动,但堆大小在短短 3 分钟内从 7.7 MB 稳定增长到大约 8.5 MB。有人可以告诉我是否存在内存泄漏以及原因,以及如果代码无限期运行是否会导致问题?谢谢!

var events = require('events');
var eventEmitter = new events.EventEmitter();
var queue = [];
var count = 0;

function queueAdd(){
    setTimeout(function (){
        if(queue.length >= 1){
            eventEmitter.emit('next'); 
            return queueAdd(); 
        };
        count += 1;
        queue.push(count.toString());
        queueAdd();
    },1000);
}

eventEmitter.on('next', function (){
    console.log(queue.shift());
});

queueAdd();

【问题讨论】:

  • 7.7 到 8.5 听起来还不是很大 - 如果持续超过 3 分钟,增长实际上会持续吗?
  • @doldt 我已经监控了超过 1000 秒,内存使用量已经增长到 14 MB
  • 你能检查你的堆栈,看看它是否在增长。您在这里使用递归有点不合常规,它可能会导致堆栈不断增长。
  • @bhspencer - 看起来没有任何“阻塞”调用。你认为堆栈可以在这里生效吗?
  • @bhspencer 这不是递归。

标签: javascript node.js memory-leaks


【解决方案1】:

您发布的代码没有泄漏。出于某种原因,nodejs 可能没有压缩堆。您添加--trace-gc 告诉节点记录垃圾收集事件。您还可以使用--max-new-space-size=1024 来收紧可用于新分配的内存量,以强制执行更频繁的 GC,并帮助验证是否存在泄漏或只是不频繁的压缩。

【讨论】:

  • 你是对的。从长远来看,堆大小确实会稳定
猜你喜欢
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 2015-10-18
  • 1970-01-01
相关资源
最近更新 更多