内存泄漏和垃圾回收机制

内存泄漏

  • 程序运行的时候需要内存,只要程序提出要求,操作系统就要给它分配内存,而随着持续的运行这些进程,必须及时释放不再用到的内存,否则轻则影响系统性能,重则导致进程崩溃。
  • 不再用到的内存,没有及时释放,就叫做内存泄漏(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 }

你可能感兴趣的:(内存泄漏和垃圾回收机制)