javascript - 为什么 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()
以及它是否是一个错误?
解决方案
通常,垃圾收集器可以并且确实收集已编译的代码,就像其他一切一样。
请记住,当对象超出范围时,垃圾收集系统不会立即释放内存。在某个时候,垃圾收集器将再次运行,识别无法访问的对象,并释放它们的内存。
在这种特殊情况下,DevTools 似乎保留了额外的数据(可能是出于调试目的),这确实使这看起来像是内存泄漏——但只有在 DevTools 打开时。我已提交crbug.com/1141613,以便团队查看。
推荐阅读
- node.js - 带有节点 x86 的 PKG
- python - 使用烧瓶从表单中读取 pdf 的 TypeError
- reactjs - 使用其他路由 React 在主页上渲染面板
- php - 使用 Laravel 8 +sail + docker 安装 Sql Server
- or-tools - 如何在创建变量期间加速 Ortools
- sharepoint - 获取 microsoft graph api 的 item-id
- mongodb - 将字符串与 MongoDB 中的对象连接起来
- node.js - 如何使用 mongodb 聚合进行分页?
- java - 从本身是目标对象的变量的对象访问Java对象的变量?
- c - 返回负数的正整数之和 - C