【问题标题】:NodeJS Memory Leak when using VM to execute untrusted code使用 VM 执行不受信任的代码时出现 NodeJS 内存泄漏
【发布时间】: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);
     });

【问题讨论】:

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


【解决方案1】:

当我看到这个正确时,这已在 v5.9.0 中修复,请参阅 this PR。在这些情况下,node 核心维护者和程序员似乎都可以做很多事情——我们几乎必须等待v8 中的上游修复。

所以不,你不能再做任何事情了。不过,抓住这个错误很好!

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多