在我创建的循环中,我删除并重新要求一个json文件,其内容是任意5000次(在我的情况下就是这样:
{
"hello": "trash",
"thing": "there"
}
我在循环之前,循环结束时以及强制垃圾收集之后记录内存使用情况:
var util = require('util')
var trash = require('./trash.json')
console.log(`Original:\n${util.inspect(process.memoryUsage())}`)
for (let tries = 0; tries < 5000; tries++) {
try {delete require.cache[require.resolve('./trash.json')]} catch (e) {}
require('./trash.json');
if (tries === 4999) console.log(`New:\n${util.inspect(process.memoryUsage())}`);
}
global.gc()
console.log(`After collection:\n${util.inspect(process.memoryUsage())}`)
输出结果为:
Original:
{ rss: 19767296,
heapTotal: 7319552,
heapUsed: 3262680,
external: 8220 }
New:
{ rss: 32210944,
heapTotal: 17805312,
heapUsed: 10002312,
external: 32796 }
After collection:
{ rss: 32989184,
heapTotal: 26193920,
heapUsed: 7442936,
external: 32796 }
似乎即使垃圾收集heapUsed
仍然比原始收集大得多。但是,当我删除require('./json')
时,heapUsed
要低得多:
Original:
{ rss: 19718144,
heapTotal: 7319552,
heapUsed: 3262640,
external: 8220 }
New:
{ rss: 24309760,
heapTotal: 10465280,
heapUsed: 5084248,
external: 8220 }
After collection:
{ rss: 24436736,
heapTotal: 10465280,
heapUsed: 3542584,
external: 8220 }
从这一点看,如果你删除缓存并在整个Node进程的生命周期中多次重复使用它们,它最终会耗尽系统的内存并且垃圾收集可以&#不可避免。 39;不要做任何事情。
但我仍然在学习内存管理的工作原理 - 是否有可能(在多次缓存删除和重新要求之后)使用的内存恢复到接近其原始值?
即使在收集垃圾后,究竟是什么占用内存?