echarts未销会导致的内存泄露定位与解决

3,682 阅读2分钟

内存泄露是指系统中的垃圾内存无法被回收,造成系统消耗的内存越积越多,给系统带来严重的负荷,长时间操作后可能会引起系统内存不足、页面无法响应、浏览器崩溃等严重现象。

一、如何发现内存泄露

  1. 任务管理器:操作页面后观察任务管理器中chrome浏览器所占用的内存是否一直在提升

  1. chrome浏览器调试工具:使用Memory标签下的Snapshot,生成堆快照,比对操作前后的快照的大小

二、Snapshot操作方法

​ 讲一下Snapshot具体的操作方法,假如现在发现页面A可能存在内存泄露,那么我们的操作如下:

​ 在进行操作之前有两点需要注意:

  1. 如果是webpack工程,需要关闭HMR功能
  2. 用chrome的无痕模式访问页面,无痕模式下会屏蔽chrome插件带来的影响

​ 具体操作步骤:

  1. 在工程中准备一个空白页面B(或者一个已经存在的简单的页面B,你认为不可能产生内存泄露的页面);

  2. 进入页面A,等待页面加载完成后,点击Chrome devTools - Memory页签的Collect garbage图标,等待数秒后,点击Take snapshot生成快照

  1. 进入页面B

  2. 再次进入页面A,等待页面加载完成后,点击Chrome devTools - Memory页签的Collect garbage图标,等待数秒后,再次点击Take snapshot生成快照

  3. 如果两次生成的快照大小不一致,则说明页面A存在内存泄露

三、分析泄露点

​ 在发现页面上有内存泄露之后,要如何定位到发生泄露的代码呢?

​ Snapshot提供了对比的功能,可以对比两个快照之间的差异

​ 如上图所示,选中第二个snapshot,然后选择Comparison,将其与snapshot1进行对比,将对比的结果按照Size Delta排序。

​ 我们点开之后发现该数据指向的是echarts相关,在代码中找echarts相关的代码,发现问题所在了:在使用echarts后没有手动销毁。

​ 我们加入销毁echasrts实例的代码

​ 再次运用snapshot查看堆内存变化。

可以发现,内存的增长显著减少,之前切换一次会增长6M左右,现在只有0.7M。

四、Tips

​ 如果你使用上述方法无法找到泄漏点,可以采用经典的二分法来定位。所谓二分法是指将页面上一半的代码注释掉,看剩余的一半代码会不会引发内存泄露,经过几次划分,应该就可以定位到内存泄露的地方了。