首先,打开 Node 命令行。
\
$ node --expose-gc
上面代码中,--expose-gc参数表示允许手动执行垃圾回收机制。
\
然后,执行下面的代码。
\
// 手动执行一次垃圾回收,保证获取的内存使用状态准确
global.gc();
undefined
\
// 查看内存占用的初始状态,heapUsed 为 4M 左右
process.memoryUsage();
{ rss: 21106688,
heapTotal: 7376896,
heapUsed: 4153936,
external: 9059 }
\
let wm = new WeakMap();
undefined
\
// 新建一个变量 key,指向一个 510241024 的数组
let key = new Array(5 * 1024 * 1024);
undefined
\
// 设置 WeakMap 实例的键名,也指向 key 数组
// 这时,key 数组实际被引用了两次,
// 变量 key 引用一次,WeakMap 的键名引用了第二次
// 但是,WeakMap 是弱引用,对于引擎来说,引用计数还是1
wm.set(key, 1);
WeakMap {}
\
global.gc();
undefined
\
// 这时内存占用 heapUsed 增加到 45M 了
process.memoryUsage();
{ rss: 67538944,
heapTotal: 7376896,
heapUsed: 45782816,
external: 8945 }
\
// 清除变量 key 对数组的引用,
// 但没有手动清除 WeakMap 实例的键名对数组的引用
key = null;
null
\
// 再次执行垃圾回收
global.gc();
undefined
\
// 内存占用 heapUsed 变回 4M 左右,
// 可以看到 WeakMap 的键名引用没有阻止 gc 对内存的回收
process.memoryUsage();
{ rss: 20639744,
heapTotal: 8425472,
heapUsed: 3979792,
external: 8956 }