我正在使用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);
});
对于https://github.com/joyent/node/issues/6552 –
只需要链接node.js github问题VM模块不足以运行不受信任的代码。尝试在非信任部分编写'while(true){}' –
现在可以在此处跟踪此问题:https://github.com/nodejs/node/issues/3113到/ joyent回购的链接现在已过期。 – Jeffrey