Node.js内存泄漏?

时间:2015-10-22 20:17:07

标签: javascript node.js memory-leaks

我收到了内存泄漏,我不明白为什么。它是基于我之前制作的可以正常工作的脚本。我所做的就是更改变量的名称并更改一个值。

这是给我内存泄漏的代码。

console.log("Mine plugin started.")
var mineflayer = require('mineflayer');
var vec3 = mineflayer.vec3;
module.exports.inject = inject;

function inject(bot) {

var Mine = false

bot.on('whisper', function (username, message) {
    if (username == bot.username) return;
    if (message == 'mine') {
        Mine = true
        gotoBlo()
}
    if (message == 'stop') {
        Mine = false
}
});

function gotoBlo() {
    if (Mine = true) {
        posBlo = bot.entity.position;
        blockBlo = findBlock('diamond_ore', 8, posBlo);
        if (blockBlo != null) {
        var tempVar = vec3(blockBlo.position.x, blockBlo.position.y, blockBlo.position.z);
        bot.scaffold.to(tempVar)
        setTimeout(gotoBlo,5000)
        }
    }
}

function findBlock(type, size, point) {
    var block = null;
    var shortest = null;
    var x1 = Math.floor(point.x - size);
    var x2 = Math.floor(point.x + size);
    var y1 = Math.floor(point.y - size);
    var y2 = Math.floor(point.y + size);
    var z1 = Math.floor(point.z - size);
    var z2 = Math.floor(point.z + size);
    //bot.chat(x1 + "");

    for (x = x1; x < x2; x++) {
        for (y = y1; y < y2; y++) {
            for (z = z1; z < z2; z++) {

                var cPoint = vec3(x, y, z);
                var cBlock = bot.blockAt(cPoint);
                //bot.chat(cPoint + "");
                if (cBlock) {
                    //bot.chat(cBlock.name);
                    if (cBlock.name == type) {
                        if ((shortest > cPoint.distanceTo(point)) || shortest == null) {
                            shortest = cPoint.distanceTo(point);
                            block = cBlock;
                        }
                    }
                }
            }
        }
    }

    return block;
}
}

这里的代码运行正常。

console.log("Defuse plugin started.")
var mineflayer = require('mineflayer');
var vec3 = mineflayer.vec3;
module.exports.inject = inject;

function inject(bot) {

var Disarm = false

bot.on('whisper', function (username, message) {
    if (username == bot.username) return;
    if (message == 'defuse') {
        disarm = true
        gotoTNT()
}
    if (message == 'stop') {
        disarm = false
}
});

function gotoTNT() {
    if (disarm = true) {
        posTNT = bot.entity.position;
        blockTNT = findBlock('tnt', 32, posTNT);
        if (blockTNT != null) {
        var tempVar = vec3(blockTNT.position.x, blockTNT.position.y, blockTNT.position.z);
        bot.scaffold.to(tempVar)
        setTimeout(gotoTNT,5000)
        }
    }
}

function findBlock(type, size, point) {
    var block = null;
    var shortest = null;
    var x1 = Math.floor(point.x - size);
    var x2 = Math.floor(point.x + size);
    var y1 = Math.floor(point.y - size);
    var y2 = Math.floor(point.y + size);
    var z1 = Math.floor(point.z - size);
    var z2 = Math.floor(point.z + size);
    //bot.chat(x1 + "");

    for (x = x1; x < x2; x++) {
        for (y = y1; y < y2; y++) {
            for (z = z1; z < z2; z++) {

                var cPoint = vec3(x, y, z);
                var cBlock = bot.blockAt(cPoint);
                //bot.chat(cPoint + "");
                if (cBlock) {
                    //bot.chat(cBlock.name);
                    if (cBlock.name == type) {
                        if ((shortest > cPoint.distanceTo(point)) || shortest == null) {
                            shortest = cPoint.distanceTo(point);
                            block = cBlock;
                        }
                    }
                }
            }
        }
    }

    return block;
}
}

1 个答案:

答案 0 :(得分:1)

基于your screen shot,它看起来好像超过了eventEmitter上的默认maxListener计数,因此它给了你一个警告,表明这可能是一个错误(它无法知道它是否是是一个真正的错误)。如果这是预期的行为,您可以使用setMaxListeners()提升最大限额,如下所示。

以下是EventEmitter对象node.js doc的引用。

  

emitter.setMaxListeners(n)的

     

默认情况下,如果超过10,EventEmitters将打印警告   为特定事件添加了侦听器。这是一个有用的默认值   这有助于发现内存泄漏。显然不是所有的发射器都应该   限制为10.此功能允许增加。调成   无穷大(或0)无限制。

     

返回发射器,因此可以链接调用。

由于您在问题中包含的特定代码并未直接添加任何事件侦听器,因此我们很难知道您的代码是否在执行某些操作,而不应该在此处执行。我看到的唯一可能值得调查的代码是bot.scaffold.to(...),以查看bot对象中的内容。

正如我在评论中提到的,还有其他一些编码错误:

你声明:

var Disarm = false

然后,你设置:

disarm = true

这两个变量应该是相同的情况。

此:

if (disarm = true) 

应改为:

if (disarm == true)

甚至更简单,只是:

if (disarm)  

if (disarm = true)将分配disarm = true,然后评估始终为true的结果,以便if语句永远不会做有用的事情。您使用=====检查条件是否相等,而不是=

然后,您的变量xyz需要在使用之前用var x, y, z声明,因此它们是正确的局部变量,而不是隐式全局变量。

仅供参考,您可以将代码粘贴到http://jshint.com/,以获取有关您可能犯错误的建议。