2014-04-22 63 views
7

我正在使用NodeJS VM Module安全地運行不可信代碼。我注意到每次執行都需要大約10M的內存,並且不會釋放它。最終,我的節點進程最終使用了500M以上的內存。經過一番挖掘,我將問題追溯到不斷創建虛擬機。爲了測試我的理論,我評論了創建虛擬機的代碼。果然,內存使用量急劇下降。然後,我再次取消註釋代碼,並將global.gc()調用放在問題區域周圍並使用 - expose-gc標誌運行節點。這大大減少了我的內存使用量並保留了功能。使用VM執行不可信代碼時NodeJS內存泄漏

有沒有更好的方式清理VM後,我完成了使用它?

我的下一個方法是緩存包含給定不安全的代碼,並重新使用它,如果它我再次看到那些不安全的代碼(背景VM:我讓用戶編寫的文本塊自己的分析功能,因此,不安全代碼被頻繁地執行或執行一次並且再也不會看到)。

一些參考碼。

async.each(items,function(i,cb){ 
      // Initialize context... 
      var context = vm.createContext(init); 

      // Execute untrusted code 
      var captured = vm.runInContext(parse, context); 

      // This dramatically improves the usage, but isn't 
      // part of the standard API 
      // global.gc(); 

      // Return Result via a callback 
      cb(null,captured); 
    }); 
+1

對於https://github.com/joyent/node/issues/6552 –

+1

只需要鏈接node.js github問題VM模塊不足以運行不受信任的代碼。嘗試在非信任部分編寫'while(true){}' –

+1

現在可以在此處跟蹤此問題:https://github.com/nodejs/node/issues/3113到/ joyent回購的鏈接現在已過期。 – Jeffrey

回答

1

當我看到這一權利這是固定在v5.9.0,看到this PR。看起來在這些情況下,node核心維護者和程序員都可以做很多事情 - 我們幾乎必須等待v8的上游修復程序。

所以不,你不能做更多的事情。抓住這個bug雖然是好的!