垃圾收集器不适用于 NodeJS / Chrome 中的类型化数组

2024-05-09

我最初将其记录为原项目中的一个问题 https://github.com/nodejs/help/issues/3590,它立即转移到帮助主题,没有很好的解释,所以现在我想在这里提问。


如果我们在 NodeJS(v14、v16、v17)中运行以下代码:

let arr = new Array(1e8);

for(const a of arr) {
}

console.log('releasing...');
arr = null;

setTimeout(() => {
}, 1e6); // let the process hang idle

进程内存由 GC 立即释放,因此其大小约为 10MB。

现在,如果我们只是交换到任何类型数组,比如说Uint8Array:

let arr = new Uint8Array(1e8);

for(const a of arr) {
}

console.log('releasing...');
arr = null;

setTimeout(() => {
}, 1e6); // let the process hang idle

现在进程内存永久位于 ~108MB,永远不会被释放。

在原来的帖子中,我有一个关于“内存不足”的回复。这对我来说没有任何意义,因为如果我将数组大小增加到 1e9,也会发生同样的情况,除了类型化数组之外,进程现在永久位于 1GB。对于单个 NodeJS 进程来说,这已经是很多了。

任何人都可以解释一下,如果我看到的是真正的错误还是我不明白的东西?

UPDATE

我的测试表明这可能与具体的问题有关for-of类型化数组的迭代器,因为如果我删除for-of迭代器,而是使用以下内容:

let t;
for(let i = 0;i < arr.length;i ++) {
  t += arr[i]; 
}

然后突然内存被正确释放。我现在想知道类型化数组的迭代器实现中是否存在错误,即泄漏或冻结内存。


在 Windows 10 上使用 NodeJS v14、v16 和 v17 进行测试


垃圾收集器正在工作。节点会在某个时刻重用或释放内存,但不是在定义的时刻。

这是一个测试应用程序,它分配一个数组,保留第二个数组,释放变量,然后重复。应用程序分配的内存符合我们的预期:它上下波动。如果垃圾收集器不工作,它就会上升。

function allocatedAndDeallocateArray(callback) {
    let arr = new Uint8Array(1e8);
    setTimeout(
        () => {
            for(const a of arr) {
            }
            arr = null;
            callback();
        },
        1000
    );
}

let count = 0;
function performAllocation() {
    if(++count < 180) {
        console.log(`${count}: Allocating new array!`);
        allocatedAndDeallocateArray(performAllocation);
    }
}

performAllocation();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

垃圾收集器不适用于 NodeJS / Chrome 中的类型化数组 的相关文章

随机推荐

  • Angular 2 - 将延迟作为输入参数传递给组件动画

    我想从 html 传递组件动画的延迟 例如 html
  • 如何“修复”SVN 分支/树冲突?

    我接手了一个软件项目 决定把所有东西都放在SVN下 上Assembla http www assembla com 使用 Tortoise SVN 树干在ROOT下 所以主干包含了整个应用程序 我标记为 1 0 对于我的第一个重要功能 我创
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp
  • Python - 如何将列表保存为图像?

    我生成一个常规列表 是否可以将此列表保存为 JPEG 图像或 PNG 或其他格式 以便我可以打开图像并查看它 我目前正在尝试使用 python 成像库 PIL 来解决这个问题 这是可能的解决方案之一 使用以下方法创建一个空图像对象 Imag
  • 阻止斯坦福核心 NLP 服务器输出它收到的文本

    我正在运行一个斯坦福核心自然语言处理 http stanfordnlp github io CoreNLP server java mx4g cp edu stanford nlp pipeline StanfordCoreNLPServe
  • 从 Jenkinsfile 中获取有关其他分支的信息

    Jenkins Blue Ocean 与链接的 Bitbucket Server 实例在同一本地网络上运行 Jenkins 中的多分支项目能够为本地 Bitbucket 服务器上链接的 Bitbucket 存储库的每个分支创建一个分支 但在
  • 如何将 default.html 的字符编码设置为 UTF-8?

    我花了几个小时来验证我的网站HTML 4 01 严格事实上我已经成功了 但仍然有一个警告我无法摆脱 警告是 字符编码不匹配 中指定的字符编码 HTTP 标头 iso 8859 1 是 与中的值不同 元素 utf 8 我将使用该值 来自 HT
  • javafx中的stackpane和root有什么区别?

    我正在练习javafx做饼图 以下是开发饼图的代码 如果我这样做Group并与StackPane 我发现输出没有区别 我已经评论了组部分 只是徘徊两者之间的区别 import javafx application Application i
  • Rails 模型测试 - 模拟与工厂

    Rails 测试模拟对象与使用工厂对象的最佳实践是什么 应该嘲笑only当模型可能转到外部源时使用 或者 您是否仅在测试实际模型并使用模拟来处理其他所有内容时才使用工厂 例如 如果我们有一个包含客户和订单的销售系统 那么当我们测试客户模型时
  • 对 Java 协议缓冲区对象进行一些小更改

    我想在 Java 协议缓冲区对象树的深处进行一个小更改 我可以使用 getBuilder 方法来创建一个新对象 该新对象是旧对象的克隆并进行一些更改 当深入完成此操作时 代码会变得丑陋 Quux Builder quuxBuilder fo
  • MATLAB 图中轴标签与轴之间的距离

    我正在使用 MATLAB 绘制一些数据 我想调整轴标签与轴本身之间的距离 但是 只需向标签的 位置 属性添加一点即可使标签移出图窗窗口 是否有 保证金 属性或类似的东西 在上图中 我想增加数字和标签 Time s 之间的距离 同时自动扩展数
  • 如何在 typeorm 中使用 LEFT JOIN LATERAL?

    我想在 TypeOrm 中使用以下查询 但找不到将其转换为 TypeOrm 的方法 任何帮助表示赞赏 SELECT FROM blocked times bt LEFT JOIN LATERAL SELECT FROM bookings b
  • 从React Redux中的package.json获取版本号(create-react-app)

    OP 编辑 如果其他人遇到此问题 该应用程序是使用创建的创建反应应用程序 https github com facebookincubator create react app 这限制导入到 src 文件夹内 但是如果你将react scr
  • Swift 从照片库中获取视频的 NSData

    我使用 UIImagePickerController 从我的库中选择视频 我需要提取视频文件的 NSData 我使用以下操作从我的库中选择视频 但我的数据似乎为零 但是我的 AVPlayer 播放生成的 NSURL 中的视频 所以我知道问
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat
  • 使用 XSLT 从文本文件中删除第一行

    我正在使用一个生成文本文件的系统 Maximo 我需要删除文件的第一行 做到这一点的方法应该是使用 XSLT 任何想法 是的 您可以在 XSLT 中完成您想要的事情 如果您可以选择的话 在 XSLT 2 0 中这样做可能会更容易 Micha
  • JS中如何过滤多个字符串? [复制]

    这个问题在这里已经有答案了 我希望能够过滤数组中的多个字符串 类型 例如我想过滤类型meat并输入fruit在下面的数据结构中 我想要实现的是过滤数据对象 const data type meat food hamburger type f
  • 无需时间即可生成随机字符串?

    我知道如何使用 Runes 和播种 rand Init 在 go 中生成随机字符串time UnixNano 我的问题是 是否可以 使用 stdlib 在不使用当前时间戳 安全 的情况下播种 rand 此外 我问 因为仅仅依靠时间来为敏感操
  • JavaScript 右移负数

    这是片段 var i 101 console log 101 i toString 2 console log 101 gt gt 1 i gt gt 1 toString 2 var l 101 console log 101 l toS
  • 垃圾收集器不适用于 NodeJS / Chrome 中的类型化数组

    我最初将其记录为原项目中的一个问题 https github com nodejs help issues 3590 它立即转移到帮助主题 没有很好的解释 所以现在我想在这里提问 如果我们在 NodeJS v14 v16 v17 中运行以下