我正在使用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);
});
答案 0 :(得分:1)
当我看到这一点时,我已在v5.9.0
中修复此问题,请参阅this PR。似乎在这些情况下,node
核心维护者和程序员都可以做很多事情 - 我们几乎不得不等待v8
中的上游修复。
所以不,你不能再做些什么。抓住这个bug虽然好!