为什么 Node.js 垃圾收集器不收集 "complied code" 的 new Function()?
Why does Node.js Garbage Collector not collect "complied code" of new Function()?
当我在setInterval()
中运行bluebird的promisify()
时,发现内存泄漏问题。有问题https://github.com/petkaantonov/bluebird/issues/1663。我怀疑是因为new Function()
的“编译代码”不能被nodejs
的gc回收。所以我 运行 下面通过 Chrome DevTools 测试和记录堆快照。随着时间的增加,new Function()
.
的“编译码”越来越多
setInterval(() => {
const a = new Function('a', 'console.log(a)');
a('1');
}, 10);
我想知道为什么 Node.js gc 不收集 new Function()
的“已编译代码”,它是否是一个错误?
运行测试脚本后的堆快照。
一般来说,垃圾收集器可以而且确实会收集编译后的代码,就像其他所有东西一样。
请记住,垃圾收集系统不会在对象超出范围时立即释放内存。在某个时候,垃圾收集器将再次 运行,识别无法访问的对象,并释放它们的内存。
在这种特殊情况下,DevTools 似乎保留了额外的数据(大概是为了调试目的),这确实使这看起来像是内存泄漏——但只有在 DevTools 打开时才会发生。我已经提交 crbug.com/1141613 以便团队可以查看。
当我在setInterval()
中运行bluebird的promisify()
时,发现内存泄漏问题。有问题https://github.com/petkaantonov/bluebird/issues/1663。我怀疑是因为new Function()
的“编译代码”不能被nodejs
的gc回收。所以我 运行 下面通过 Chrome DevTools 测试和记录堆快照。随着时间的增加,new Function()
.
setInterval(() => {
const a = new Function('a', 'console.log(a)');
a('1');
}, 10);
我想知道为什么 Node.js gc 不收集 new Function()
的“已编译代码”,它是否是一个错误?
运行测试脚本后的堆快照。
一般来说,垃圾收集器可以而且确实会收集编译后的代码,就像其他所有东西一样。
请记住,垃圾收集系统不会在对象超出范围时立即释放内存。在某个时候,垃圾收集器将再次 运行,识别无法访问的对象,并释放它们的内存。
在这种特殊情况下,DevTools 似乎保留了额外的数据(大概是为了调试目的),这确实使这看起来像是内存泄漏——但只有在 DevTools 打开时才会发生。我已经提交 crbug.com/1141613 以便团队可以查看。