gpt4 book ai didi

javascript - 为什么在创建对象之前使用 global.gc() 可以防止堆使用量出现负增量?

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:44 26 4
gpt4 key购买 nike

我有这段代码,旨在在子进程中运行(具体来说,通过fork),以便尝试测量内存中对象的大小:

const syncComputationThatResultsInALargeObject = require('whatever');

let initMemory;
let finalMemory;
let obj;
process.on('message', () => {
// global.gc();
initMemory = process.memoryUsage().heapUsed;
obj = syncComputationThatResultsInALargeObject();
finalMemory = process.memoryUsage().heapUsed;

process.send({
memoryCost: finalMemory - initMemory,
});
});

使用子进程完成此操作的原因是为了防止父进程中存在的变量造成任何污染。

令人惊讶的是,我观察到有时返回的 memoryCost 为负数,这意味着创建 obj 后堆大小较小。

但是,如果我在 Node 中使用 --expose-gc 启用手动 GC 调用,并在创建对象之前轮询堆使用情况之前调用 GC,则我永远不会得到负值。

任何人都可以回答为什么会发生这种情况吗?我在 Ubuntu 18.04.1 上使用 Node 6.14.4,内核 4.15.0-30-generic。谢谢。

编辑:即使我在分配给finalMemory之后引用obj,例如,通过将对其字段之一的引用放入传递给process.send的对象中,也会发生这种情况。

最佳答案

经过几次测试,我能够理解为什么会发生这种情况。

在我的计算函数的特定实例中,我能够传递几个影响结果对象大小的参数。

我最终观察到,当对不同的参数集重复计算多次时,生成较大对象的参数集在结果之间呈现出更大的离散度,即使我在指定的行调用 global.gc() 也是如此。

因此,我将观察到的行为归因于这样一个事实:有时 GC 在计算函数内部以一种不可控的方式被调用。更大的对象大小意味着更大的内存使用量,这意味着更频繁(因此可能不可预测)的 GC 调用,这意味着相同参数的结果分散性更大。

关于javascript - 为什么在创建对象之前使用 global.gc() 可以防止堆使用量出现负增量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51882683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com