在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);
有人能解释一下这里的内存泄漏到底在哪里吗?内存中什么东西会保留在什么地方?
答案 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运行内存实际上从应用程序启动时就减少了。示例运行:
答案 1 :(得分:1)
我相信,如果您放置1或2秒的setTimeout并结束所有操作,然后再次检查内存使用情况,则会发现您的内存又变少了。由于您在同步循环中使用的是异步函数,因此这些迭代都将存储在内存中,同时它们等待堆栈被清空(直到之后执行完代码,包括内存检查)。