2015-10-22 54 views
-1

我得到一個內存泄漏,我不知道爲什麼。它基於我以前編寫的腳本,它工作正常。我所做的只是更改變量的名稱並更改其中一個的值。Node.js內存泄漏?

這是代碼給我一個內存泄漏。

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

此代碼有多處錯誤。如「撤防」和「撤防」不匹配。並且,假設「if(disarm = true)'應該是'if(disarm == true)',因爲你擁有的東西永遠是真的。你也有一堆隱含的全局變量,這很糟糕,比如你的'for'循環中的'x','y'和'z'。你應該用'var'或'let'聲明所有的變量。 – jfriend00

+1

請準確描述你如何確定你實際上有內存泄漏。誤診泄漏是非常常見的,所以首先要確定是否確實有泄漏。 – jfriend00

+0

https://gyazo.com/fcbf3bfa560a91ca02ba88d644fb4304 – Ezcha

回答

1

基於your screen shot,它只是看起來像你超過了默認maxListener上eventEmitter計數,因此它給你一個警告indicateing這可能是個錯誤(它沒有辦法知道,如果它是一個實際的錯誤方式或不)。如果這是預期的行爲,那麼您可以通過setMaxListeners()將最大限制提升至如下所示。

以下是來自node.js docEventEmitter對象的引用。如果超過10個 偵聽加入特定事件

emitter.setMaxListeners(N)

默認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然後評價T他的結果總是會是true,所以if聲明永遠不會有用。您檢查條件是否與=====相等,而不是=


然後,你的變量xyz需要使用它們之前var x, y, z宣佈所以他們是正確的局部變量,而不是全局隱。


僅供參考,您可以將代碼粘貼到http://jshint.com/讓你在哪裏可能已經犯了一些錯誤一些建議。

+0

工作!謝謝! – Ezcha

+0

@Minecheese - 很好用。由於您看起來在這裏可能相對較新,您是否知道如果您的問題得到解答,您可以查看收到的最佳答案左側的綠色複選標記,這會向社區表明您的問題現在已解決並且它也將爲您和提供答案的人提供一些聲譽積分,從而在積累足夠積分時爲您贏得更多優惠。 – jfriend00

+0

好的,謝謝! – Ezcha