javascript - 使用 Promises 时 Typescript 中的内存泄漏

标签 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 就越大。

通过适本地减少方法,并且不使用 promises 而使用简单的方法,使用的堆变得稳定并且即使我迭代 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);

谁能解释一下内存泄漏到底在哪里?什么东西永远留在内存中?

最佳答案

Can anyone explain a little bit where is exactly the memory leak here

内存使用不是内存泄漏。如果内存可以被垃圾收集,那么它就不会泄漏。您的示例根本不够大,无法保证 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();

如果您运行此程序,您会注意到 之后 gc 运行内存实际上从应用程序启动时开始减少。示例运行:

enter image description here

关于javascript - 使用 Promises 时 Typescript 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51939989/

相关文章:

javascript - Extjs 4 轮播

javascript - 如何在支持 tree shaking 的同时使用 `chain` 和 `lodash-es`?

javascript - JavaScript 可以与不同的服务器通信吗?

javascript - AngularJS基于单选按钮与文本框结合的过滤表

reactjs - 用于 typescript 的 eslint-plugin-jsx-a11y

javascript - typescript /Node : Error [ERR_MODULE_NOT_FOUND]: Cannot find module

javascript - 如何将异步方法拆分成更小的部分并依次调用它们?

angular - 无法将值数组推送到 Json Typescript Angular

javascript - Knex where 不允许将单个字符串传递给 `.where()`

typescript - 类中的抽象属性不能在构造函数中访问