【发布时间】:2014-06-06 12:49:09
【问题描述】:
我正在使用 NodeJS VM Module 安全地运行不受信任的代码。我注意到一个巨大的内存泄漏,每次执行大约需要 10M 内存并且不会释放它。最终,我的节点进程最终使用了 500M+ 的内存。经过一番挖掘,我将问题追溯到不断创建虚拟机。为了测试我的理论,我注释掉了创建虚拟机的代码。果然,内存使用量急剧下降。然后我再次取消注释代码并在问题区域周围战略性地放置 global.gc() 调用并使用--expose-gc 标志运行节点。这大大减少了我的内存使用量并保留了功能。
有没有更好的方法在我用完后清理虚拟机?
我的下一个方法是缓存包含给定不安全代码的虚拟机,并在我再次看到不安全代码时重新使用它(背景:我让用户为文本块编写自己的解析函数,因此,不安全代码是经常执行或执行一次就再也见不到了)。
一些参考代码。
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);
});
【问题讨论】:
-
这个github.com/joyent/node/issues/6552的node.js github问题的链接
-
VM 模块不足以运行不受信任的代码。尝试在不受信任的部分写
while(true){} -
现在可以在此处跟踪此问题:github.com/nodejs/node/issues/3113 /joyent 存储库的链接现已过期。
标签: node.js memory-leaks garbage-collection virtual-machine