内存泄漏

3 阅读2分钟

V8 GC

老生常谈

简单来说就是从检测对象是否可达,不可达就GC

这里不赘述新老生代,from to空间等机制

内存泄漏

从GC来看,就是全局对象和一些一直存在的对象的引用链条中,一些用不到的引用没有释放

具体来看

  1. 仍然存活的Dom上的监听器等引用链条
  2. 已经销毁的Dom被引用
  3. 没有被释放的setInterval的引用链条
  4. 全局对象(挂载到window上)的引用链条
  5. 一些观察器和订阅的WebApi

所以要谨慎:

  1. 及时移除Dom上的用不到的监听器
  2. 谨慎引用全局引用会被销毁的Dom
  3. setInterVal的及时释放,和对于需要持续运行的setInterVal谨慎维护内部的引用
  4. 全局的订阅和观察器的移除
  5. 谨慎挂载全局对象和将对象设置为全局对象的引用

其中最关键的在于两点:dom监听器和全局对象

全局对象

一定要谨慎升级任何对象为全局对象,谨慎挂载在window上的对象,因为这会导致其所有的引用链条无法被GC释放!

winodw是持续存在整个页面周期的,也是距离GC的根非常近的,所有挂载到全局上的对象,如果不手动设置为null,都要做好在整个生命周期中都存在的准备

并且其所有链条中的任何引用都将可达,不会被GC,如果其引用繁杂,很可能导致不需要的对象无法被释放

dom监听器

这个相对还好,因为被移除的dom监听器也会被移除

但是还是要注意始终存在的dom,如侧边栏等等,其上的监听器如果用不到要及时移除!

如何找到内存泄漏?

使用devtool,todo。。