首页 > 解决方案 > 为什么 Node.js 垃圾收集器不收集 new Function() 的“编译代码”?

问题描述

当我运行 bluebird's promisify()in 时setInterval(),我发现了内存泄漏问题。有问题https://github.com/petkaantonov/bluebird/issues/1663。我怀疑这是因为 .gc 的“编译代码”new Function()无法收集nodejs。所以我运行以下测试并通过 Chrome DevTools 记录堆快照。随着时间的推移,. 的“编译代码”越来越多new Function()

setInterval(() => {
    const a = new Function('a', 'console.log(a)');
    a('1');
}, 10);

我想知道为什么 Node.js gc 不收集“编译代码”new Function()以及它是否是一个错误?

运行测试脚本后的堆快照。 堆快照

标签: javascriptnode.jsmemory-leaksv8jit

解决方案


通常,垃圾收集器可以并且确实收集已编译的代码,就像其他一切一样。

请记住,当对象超出范围时,垃圾收集系统不会立即释放内存。在某个时候,垃圾收集器将再次运行,识别无法访问的对象,并释放它们的内存。

在这种特殊情况下,DevTools 似乎保留了额外的数据(可能是出于调试目的),这确实使这看起来像是内存泄漏——但只有在 DevTools 打开时。我已提交crbug.com/1141613,以便团队查看。


推荐阅读