【问题标题】:Why does Node.js Garbage Collector not collect "complied code" of new Function()?为什么 Node.js 垃圾收集器不收集 new Function() 的“编译代码”?
【发布时间】:2026-02-17 13:55:02
【问题描述】:

当我在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() 的“编译代码”以及它是否是一个错误?

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

【问题讨论】:

    标签: javascript node.js memory-leaks v8 jit


    【解决方案1】:

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

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

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

    【讨论】:

    • 哦,真可爱 :-)
    最近更新 更多