内存泄漏
- 程序运行的时候需要内存,只要程序提出要求,操作系统就要给它分配内存,而随着持续的运行这些进程,必须及时释放不再用到的内存,否则轻则影响系统性能,重则导致进程崩溃。
- 不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)。
垃圾回收机制
“引用技术” 如果一个值得引用次数是0 ,则表示这个值不再被用到,因此这块内存就可以释放。
WeakSet 和 WeakMap
它们对于值的引用都是不计入垃圾回收机制的,所以名字里面才会有一个”Weak”,表示这是弱引用
使用 node 命令证实:
$ node --expose-gc
--expose-gc 参数表示允许手动执行垃圾回收机制。
// 手动执行一次垃圾回收,保证获取的内存使用状态准确
Global.gc()
// 第一次调用以后,查看内存占用的初始状态,heapUsed 为 4M 左右
Process.memoryUsage();
{ rss: 21106688,
heapTotal: 7376896,
heapUsed: 4153936,
external: 9059 }
// 创建 WeakMap引用
Let wm = new WeakMap();
// 查看创建 WeakMap引用后的内存 heapUsed 为 4M 左右
Global.gc()
Process.memoryUsage();
{ rss: 20537344,
heapTotal: 9474048,
heapUsed: 3967272,
external: 8993 }
wm.set(“a”,[fq,gherw,httew,ht]);
// 查看引用WeakMap后的内存 heapUsed 为 45M 左右
Global.gc()
Process.memoryUsage();
{ rss: 62652416,
heapTotal: 51437568,
heapUsed: 45911664,
external: 8951 }
// 解除对象a的引用
a = null;
// 再查看释放 a后的内存 heapUsed 为 4M 左右
Global.gc()
Process.memoryUsage();
{ rss: 20639744,
heapTotal: 8425472,
heapUsed: 3979792,
external: 8956 }