2014-04-22 61 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虽然是好的!