Javascript Node.js内存泄漏?
我有一个内存泄漏,我不知道为什么。这是基于我之前制作的一个脚本,效果很好。我所做的只是更改变量的名称和一的值 这是导致我内存泄漏的代码Javascript Node.js内存泄漏?,javascript,node.js,memory-leaks,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
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(“我的插件启动了”)
var mineflayer=require('mineflayer');
var vec3=mineflayer.vec3;
module.exports.inject=注入;
功能注入(bot){
var Mine=错误
bot.on('whisper',函数(用户名、消息){
如果(username==bot.username)返回;
如果(消息==‘我的’){
我的=真的
gotoBlo()
}
如果(消息==‘停止’){
我的=错
}
});
函数gotoBlo(){
如果(我的=真){
posBlo=bot.entity.position;
blockBlo=findBlock(“钻石矿”,8,posBlo);
if(blockBlo!=null){
var tempVar=vec3(blockBlo.position.x,blockBlo.position.y,blockBlo.position.z);
bot.scaffold.to(tempVar)
设置超时(gotoBlo,5000)
}
}
}
函数findBlock(类型、大小、点){
var block=null;
var=null;
var x1=数学地板(x点-尺寸);
var x2=数学地板(x点+尺寸);
变量y1=数学地板(点y-尺寸);
变量y2=数学地板(点y+尺寸);
var z1=数学地板(z点-尺寸);
var z2=数学地板(z点+尺寸);
//聊天机器人(x1+“”);
对于(x=x1;xcPoint.distanceTo(point))| |最短==null){
最短=点到(点)的距离;
block=cBlock;
}
}
}
}
}
}
返回块;
}
}
下面是工作正常的代码
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;
}
}
console.log(“解除插件启动”)
var mineflayer=require('mineflayer');
var vec3=mineflayer.vec3;
module.exports.inject=注入;
功能注入(bot){
var Disarm=false
bot.on('whisper',函数(用户名、消息){
如果(username==bot.username)返回;
如果(消息=='defuse'){
解除武装=正确
gotoTNT()
}
如果(消息==‘停止’){
解除武装=错误
}
});
函数gotoTNT(){
如果(解除武装=真){
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)
设置超时(gotoTNT,5000)
}
}
}
函数findBlock(类型、大小、点){
var block=null;
var=null;
var x1=数学地板(x点-尺寸);
var x2=数学地板(x点+尺寸);
变量y1=数学地板(点y-尺寸);
变量y2=数学地板(点y+尺寸);
var z1=数学地板(z点-尺寸);
var z2=数学地板(z点+尺寸);
//聊天机器人(x1+“”);
对于(x=x1;xcPoint.distanceTo(point))| |最短==null){
最短=点到(点)的距离;
block=cBlock;
}
}
}
}
}
}
返回块;
}
}
基于,看起来您在eventEmitter
上超过了默认的maxListener计数,因此它向您发出警告,指出这可能是一个错误(它无法知道这是否是实际错误)。如果这是一种预期行为,您可以使用setMaxListeners()
增加最大限制,如下所示
下面是对EventEmitter
对象的引用
发射器.setMaxListeners(n)
默认情况下,如果超过10,EventEmitter将打印警告
为特定事件添加侦听器。这是一个有用的默认值
这有助于查找内存泄漏。显然,并不是所有的发射器都应该这样
限10人。此功能允许增加该值。着手
无限(或0)表示无限
返回发射器,因此可以链接调用
由于您在问题中包含的特定代码没有直接添加任何事件侦听器,因此我们很难知道您的代码是否在做不应该做的事情。我看到的唯一值得研究的代码是bot.scaffold.to(…)
以查看bot
对象内部的功能
正如我在评论中提到的,还有几个其他编码错误: 您声明:
var Disarm = false
然后,设置:
disarm = true
这两个变量应该是相同的情况
这: 应改为:
if (disarm == true)
或者更简单,只是:
if (disarm)
if(disarm=true)
将分配disarm=true
,然后评估结果,该结果将始终为true
,因此if
语句从未做过有用的事情。检查条件是否与=
或==
相等,而不是与=
相等
然后,您的变量
x
、y
和z
在使用之前需要使用var x、y、z
声明,以便它们是适当的局部变量,而不是隐式全局变量
仅供参考,您可以将代码粘贴到中,以获得关于您可能犯了一些错误的建议。t中有多个错误
if (disarm)