开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情
Vue是一种前端开发框架,可以帮助用户更高效地开发项目。但是,它也有一个不可忽视的问题:内存泄漏。内存泄漏指的是在使用Vue 时,内存不断增长而不释放,导致系统性能下降。
JavaScript 有完善的内存处理机制,能自动进行垃圾回收,但是假如一个对象一直被引用,他的内存是无法得到释放的。如果项目运行过程中,内存占用越来越高,只增不减,没有峰值,就存在内存泄漏
什么是内存泄漏
简单理解, 比如:new了一个对象之后,它申请占用了一块堆内存,当把这个对象指针置为null时或者离开作用域导致被销毁,那么这块内存没有人引用它了,在JS里面就会被自动垃圾回收。但是如果这个对象指针没有被置为null,且代码面 没办法再获取到这个对象指针了,就会导致无法释放掉它指向的内存,也就是说发生了内存泄露。
如何判断内存泄漏
Chrome 浏览器 memory 有 3 种方式,可以分析内存:
- Heap snapshot - 用以打印堆快照,堆快照文件显示页面的 javascript 对象和相关 DOM 节点之间的内存分配
- Allocation instrumentation on timeline - 在时间轴上记录内存信息,随着时间变化记录内存信息。
- Allocation sampling - 内存信息采样,使用采样的方法记录内存分配。此配置文件类型具有最小的性能开销,可用于长时间运行的操作。它提供了由 javascript 执行堆栈细分的良好近似值分配。
如何定位内存泄漏
点击快照 - 并 hover 右测的列表项,会显示部分存在内存泄漏的地方
常见的内存泄漏
- 不适当的数据绑定。在 Vue中,on 和$watch 会对数据进行绑定,如果没有及时的解除绑定,就会出现内存泄漏。
- 不正确的 dom 操作。在 Vue 中,如果使用了错误的 dom 操作,例如创建了多个相同的元素,或者忘记销毁已经创建的元素,都很容易造成内存泄漏。
- 缺乏定时器清理。有时候,我们会在 Vue 中使用 setTimeout或setInterval等定时器,如果没有及时清理,很容易造成内存泄漏。
- 闭包引起内存泄漏。比如事件处理回调,导致 DOM 对象和脚本中对象双向引用。
- 使用第三方库创建,没有调用正确的销毁函数
- 单页应用时,页面路由切换后,内存未释放
解决Vue中的内存泄漏问题,可以采取以下方法:
- 正确地使用数据绑定。在使用on 和$watch 等数据绑定时,一定要注意及时解除绑定,以防止内存泄漏。
- 使用正确的 dom 操作。在使用 Vue 的过程中,应该注意避免重复创建相同的元素,并及时销毁己创建的元素,以防止内存泄漏。
- 及时清理定时器。在使用定时器时,要注意清理定时器,以避免内存泄漏。
- 慎用 keep-alive
当你用 keep-alive 包裹一个组件后,它的状态就会保留,因此就留在了内存里,切莫在整个路由页面上加上 keep-alive。
一旦你使用了 keep-alive,那么你就可以访问另外两个生命周期钩子:activated 和 deactivated。你需要在一个 keep-alive 组件被移除的时候,调用 deactivated 钩子进行清理或改变数据。
总之,Vue的内存泄漏是一种比较常见的缺陷,要想解决内存泄漏,首先要分析原因,然后根据不同原因采取不同的解决方案,保证编码的质量,从而发现和解决内存泄漏问题,有效提升系统性能。