使用虚拟机执行不可信代码时NodeJS内存泄漏

我正在使用NodeJS VM模块安全地运行不受信任的代码。 我注意到一个巨大的内存泄漏,每次执行需要大约10M的内存,并没有释放它。 最终,我的节点进程最终使用了500M以上的内存。 经过一番挖掘,我将问题追溯到不断创build的虚拟机。 为了testing我的理论,我注释了创build虚拟机的代码。 果然,内存使用量急剧下降。 然后,我再次取消注释代码,并将global.gc()调用放在问题区域周围,并使用 – expose-gc标志运行节点。 这大大减less了我的内存使用,并保留了function。

在完成使用之后,有没有更好的清理虚拟机的方法?

我的下一个方法是caching包含给定的不安全代码的虚拟机,如果我再次看到不安全的代码,则重用它(背景:我让用户为文本块编写自己的parsing函数,因此不安全的代码会频繁执行或执行一次,从来没有见过)。

一些参考代码。

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); }); 

当我看到这个权利,这是固定在v5.9.0 ,看到这个公关 。 看来在那些情况下, node核心维护者和程序员都可以做很多事情 – 我们几乎不得不等待v8的上游修复。

所以不,你不能做更多的事情。 抓住这个bug虽然是好的!