Node.js内存泄漏

Node.js Memory leak?

本文关键字:泄漏 内存 js Node      更新时间:2023-09-26

我正在获得内存泄漏,我不知道为什么。它是基于以前的脚本,我做的工作很好。我所做的只是更改了变量的名称,并更改了其中一个变量的值。

这是导致内存泄漏的代码。

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;
}
}

根据您的屏幕截图,看起来您超过了eventEmitter上的默认maxListener计数,因此它给了您一个警告,表明这可能是一个错误(它无法知道这是否是一个实际错误)。如果这是您想要的行为,您可以使用setMaxListeners()增加最大限制,如下所示。

这是一个引用自node.js文档的EventEmitter对象。

emitter.setMaxListeners (n)

默认情况下,如果超过10,eventemitter将打印一个警告为特定事件添加侦听器。这是一个有用的默认值这有助于发现内存泄漏。显然不是所有的排放者都应该如此限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语句永远不会做任何有用的事情。您检查条件是否与=====相等,而不是与=相等。


那么,你的变量x, yz需要在使用它们之前用var x, y, z声明,这样它们是适当的局部变量,而不是隐式全局变量。


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