使用Promise时Typescript中的内存泄漏

时间:2018-08-21 00:10:50

标签: javascript typescript

在Typescript中具有这段代码

const f = async function() {
    return 1+1;
};

let memory = process.memoryUsage();
let i = 0;
while (i < 100000) {
    let result = await f().then(function(res) {}).catch(function() {});
    i++;
}
let memory2 = process.memoryUsage();
console.log(memory2.heapUsed - memory.heapUsed);

我进行的迭代越多,两点之间的heapUsed越大。

通过适当地减少方法,而不是使用promise,而是使用一种简单的方法,即使我迭代了100万次,使用的堆也会变得稳定并且不会改变。

const f = function() {
    return 1+1;
};

let memory = process.memoryUsage();
let i = 0;
while (i < 200000) {
    let r = f();
    i++;
}
let memory2 = process.memoryUsage();
console.log(memory2.heapUsed - memory.heapUsed);

有人能解释一下这里的内存泄漏到底在哪里吗?内存中什么东西会保留在什么地方?

2 个答案:

答案 0 :(得分:5)

  

谁能解释一下这里的内存泄漏到底在哪里

内存使用不是内存泄漏。如果内存可以被垃圾回收,则不会泄漏。您的示例根本不够大,无法保证可以运行GC。

以下代码强制运行gc (不推荐!):

const f = async function () {
    return 1 + 1;
};

async function main() {
    let memory = process.memoryUsage();
    let i = 0;
    while (i < 100000) {
        let result = await f().then(function(res) {}).catch(function() {});
        i++;
    }
    console.log('before', process.memoryUsage().heapUsed - memory.heapUsed);
    global.gc();
    console.log('after', process.memoryUsage().heapUsed - memory.heapUsed);
}

main();

如果运行此命令,您会注意到after的gc运行内存实际上从应用程序启动时就减少了。示例运行:

enter image description here

答案 1 :(得分:1)

我相信,如果您放置1或2秒的setTimeout并结束所有操作,然后再次检查内存使用情况,则会发现您的内存又变少了。由于您在同步循环中使用的是异步函数,因此这些迭代都将存储在内存中,同时它们等待堆栈被清空(直到之后执行完代码,包括内存检查)。