NodeJS内存使用VM执行不受信任的代码时泄漏

时间:2014-04-22 08:43:17

标签: node.js memory-leaks garbage-collection virtual-machine

我正在使用NodeJS VM Module安全地运行不受信任的代码。我注意到一个巨大的内存泄漏,每次执行需要大约10M的内存,并且不会释放它。最终,我的节点进程最终使用500M +内存。经过一番挖掘,我将问题追溯到不断创建虚拟机。为了测试我的理论,我评论了创建VM的代码。果然,内存使用率急剧下降。然后我再次取消注释代码并在问题区域周围策略性地放置了global.gc()调用,并使用 - expose-gc标志运行节点。这大大减少了我的内存使用量并保留了功能。

使用完之后是否有更好的方法来清理虚拟机?

我的下一个方法是缓存包含给定的不安全代码的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 个答案:

答案 0 :(得分:1)

当我看到这一点时,我已在v5.9.0中修复此问题,请参阅this PR。似乎在这些情况下,node核心维护者和程序员都可以做很多事情 - 我们几乎不得不等待v8中的上游修复。

所以不,你不能再做些什么。抓住这个bug虽然好!