V8 GC
老生常谈
简单来说就是从根检测对象是否可达,不可达就GC
这里不赘述新老生代,from to空间等机制
内存泄漏
从GC来看,就是全局对象和一些一直存在的对象的引用链条中,一些用不到的引用没有释放
具体来看
- 仍然存活的Dom上的监听器等引用链条
- 已经销毁的Dom被引用
- 没有被释放的setInterval的引用链条
- 全局对象(挂载到window上)的引用链条
- 一些观察器和订阅的WebApi
所以要谨慎:
- 及时移除Dom上的用不到的监听器
- 谨慎引用全局引用会被销毁的Dom
- setInterVal的及时释放,和对于需要持续运行的setInterVal谨慎维护内部的引用
- 全局的订阅和观察器的移除
- 谨慎挂载全局对象和将对象设置为全局对象的引用
其中最关键的在于两点:dom监听器和全局对象
全局对象
一定要谨慎升级任何对象为全局对象,谨慎挂载在window上的对象,因为这会导致其所有的引用链条无法被GC释放!
winodw是持续存在整个页面周期的,也是距离GC的根非常近的,所有挂载到全局上的对象,如果不手动设置为null,都要做好在整个生命周期中都存在的准备
并且其所有链条中的任何引用都将可达,不会被GC,如果其引用繁杂,很可能导致不需要的对象无法被释放
dom监听器
这个相对还好,因为被移除的dom监听器也会被移除
但是还是要注意始终存在的dom,如侧边栏等等,其上的监听器如果用不到要及时移除!
如何找到内存泄漏?
使用devtool,todo。。