global.gc

617 阅读1分钟

首先,打开 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 }