Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在异步函数中迭代承诺时,内存使用量显著增加_Node.js_Memory_Promise - Fatal编程技术网

Node.js 在异步函数中迭代承诺时,内存使用量显著增加

Node.js 在异步函数中迭代承诺时,内存使用量显著增加,node.js,memory,promise,Node.js,Memory,Promise,在下面的代码中,我试图找出是什么导致了迭代期间内存使用量的显著增加 async function a () { for (let i = 0; i < 10000000000; i++) { await new Promise(resolve => { if (i%100000 === 0) { console.log(i) console.log(process.memo

在下面的代码中,我试图找出是什么导致了迭代期间内存使用量的显著增加

async function a () {
    for (let i = 0; i < 10000000000; i++) {
        await new Promise(resolve => {
            if (i%100000 === 0) {
                console.log(i)
                console.log(process.memoryUsage())
            }
            resolve(i)
        })
    }
}
a()
异步函数a(){
对于(设i=0;i<1000000000;i++){
等待新的承诺(解决=>{
如果(i%100000==0){
控制台日志(i)
console.log(process.memoryUsage())
}
决议(一)
})
}
}
()
在代码运行时,这种内存使用跳跃会发生几次,并且总是在i达到某些特定数字时发生

在7.9.0中,始终出现在2000000->2100000之间
1700000
{rss:20135936,heapTotal:9355264,heapUsed:6003256,external:8772}
1800000
{rss:19836928,heapTotal:9355264,heapUsed:4490432,external:8772}
1900000
{rss:19316736,heapTotal:9355264,heapUsed:5039992,external:8772}
2000000
{rss:19357696,heapTotal:9355264,heapUsed:5587808,external:8772}
2100000
{rss:23605248,heapTotal:13549568,heapUsed:6088208,external:8772}
2200000
{rss:23601152,heapTotal:13549568,heapUsed:6586000,external:8772}
2300000
{rss:23568384,heapTotal:13549568,heapUsed:7083112,external:8772}
在8.3.0中,始终出现在2600000->2700000之间
2400000
{rss:30507008,heapTotal:9437184,heapUsed:4785896,external:8252}
2500000
{rss:30523392,heapTotal:9437184,heapUsed:4710912,external:8252}
2600000
{rss:30539776,heapTotal:9437184,heapUsed:4636176,external:8252}
2700000
{rss:34742272,heapTotal:13631488,heapUsed:6606512,external:8252}
2800000
{rss:34750464,heapTotal:13631488,heapUsed:8571208,external:8252}
2900000
{rss:34758656,heapTotal:13631488,heapUsed:6412304,external:8252}
在V8(Node.JS使用的JS运行时)中,为堆预先分配了一组大小。这是您看到的
heapTotal
。当V8怀疑您将需要更多空间时,它将增加堆的总大小

在您的示例代码中,发生的情况是在堆上分配了许多小对象。这反映在
heapUsed
中,是代码正在使用的实际内存量。当堆填满时,执行一轮垃圾收集(GC),释放空间。因此,如果您在递增
i
时绘制
heapUsed
,那么您将看到它不断上升,直到GC启动,它又会下降

事实上,这正是我长期以来所做的

您可以清楚地看到,在GC启动之前,堆永远不允许变大

为了进一步验证这一点,如果我们使用
节点--expose\u GC

async function run() {
    for (let i = 0; i < 10000000000; i++) {
        await new Promise(async resolve => {
            if (i % 10000000 === 0) {
                global.gc();
                console.log(`${i}, ${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)}mb`);
            }
            resolve();
        });
    }
}
run();
不同的节点版本 非常有趣的是,如果我们在不同版本的node上运行测试

如您所见,v8.2.0之前版本和node.js后续版本的内存配置文件存在巨大差异。如果我们去看看v8.3.0的版本,我们就会明白为什么了

V8发动机已升级至6.0版,其性能状况发生了显著变化

这是包含的V8版本,它实现了大量节点,并为GC提供了许多性能增强


Thorsten Lorenz的repo中提供了关于V8 GC如何工作的更深入的视图。

两个屏幕截图是否都是相同的?我提供了两个新的屏幕截图,它们更清楚地显示了显著的增长。这两个屏幕截图显示了在nodejs7.9和nodejs8.3中运行的结果。无论我尝试了多少次,RSS跳转都会在一个版本中以相同的计数发生。这就是您的程序的范围吗?或者在这个循环运行的同时还有其他的东西吗?如果还有更多,你能发布它吗(或者如果它太大的话描述它)?只需复制粘贴代码并在节点中运行它,然后观察RSS。
2400000
{ rss: 30507008, heapTotal: 9437184, heapUsed: 4785896, external: 8252 }
2500000
{ rss: 30523392, heapTotal: 9437184, heapUsed: 4710912, external: 8252 }
<-- Jump happens between here -->
2600000
{ rss: 30539776, heapTotal: 9437184, heapUsed: 4636176, external: 8252 }
2700000
{ rss: 34742272, heapTotal: 13631488, heapUsed: 6606512, external: 8252 }
<-- and here -->
2800000
{ rss: 34750464, heapTotal: 13631488, heapUsed: 8571208, external: 8252 }
2900000
{ rss: 34758656, heapTotal: 13631488, heapUsed: 6412304, external: 8252 }
async function run() {
    for (let i = 0; i < 10000000000; i++) {
        await new Promise(async resolve => {
            if (i % 10000000 === 0) {
                global.gc();
                console.log(`${i}, ${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)}mb`);
            }
            resolve();
        });
    }
}
run();
0, 3.12mb
10000000, 2.77mb
20000000, 2.78mb
30000000, 2.78mb
40000000, 2.78mb
50000000, 2.78mb
60000000, 2.78mb