NodeJS内存使用VM执行不受信任的代码时泄漏

How*_*erg 7 garbage-collection memory-leaks virtual-machine node.js

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

使用完之后有没有更好的方法来清理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);
     });
Run Code Online (Sandbox Code Playgroud)

elj*_*efe 1

当我看到这个问题时,这个问题已被修复v5.9.0,请参阅此 PR。看来在这些情况下,node核心维护者和程序员都可以做很多事情 - 我们几乎必须等待v8.

所以不,你对此无能为力。抓住这个错误还是很好的!