小编给大家分享一下VueJS SSR后端绘制内存泄漏的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
引言
Memory Leak 是最难排查调试的 Bug 种类之一,因为内存泄漏是个 undecidable problem,只有开发者才能明确一块内存是不是需要被回收。再加上内存泄漏也没有特定的报错信息,只能通过一定时间段的日志来判断是否存在内存泄漏。大家熟悉的常用调试工具对排查内存泄漏也没有用武之地。当然了,除了专门用于排查内存泄漏的工具(抓取Heap之类的工具)之外。
对于不同的语言,各种排查内存泄漏的方式方法也不尽相同。对于 JavaScript 来说,针对不同的平台,调试工具也是不一样的,最常用的恐怕还是 Chrome 自带的各种利器(针对 browser 也好,nodeJS 也好)都有不错的使用体验,网上也有很多使用教程。
这次我想给大家介绍的内存泄漏的定位方法,并非工具的使用。而是一些经验的总结,也就是我所知道的 VueJS SSR 中最容易出现内存泄漏的地方,如果大家知道更多 VueJS SSR 内存泄漏点,可以在评论处留言告诉更多的人。
难点
遇到过 VueJS SSR 内存泄漏的朋友可能知道,针对 VueJS SSR 内存泄漏的排查,与普通 NodeJS 和 Browser 平台相比是要麻烦很多的。如果你使用了 webpack-dev-server 在本地调试,你会发现常用的内存泄漏工具毫无用武之地,因为抓取到的信息不仅包括 VueJS SSR 进程信息,还包含了 Webpack 的进程信息,甚至还有 webpack-dev-server 的各种堆信息。当然了,你也可以通过各种手段来过滤掉无关的信息,从而只剩下 VueJS SSR 的堆信息。
我在排查我们组项目内存泄漏的时候,动用了各种常规工具,但最终发现 VueJS SSR 的内存泄漏有很大可能性出现在以下地方,也就说如果,你碰巧也有 VueJS SSR 内存泄漏的问题,先不要使用内存泄漏排查工具,首先从下面几个地方着手,看看是否有内存泄漏的逻辑。可能直击要害,节约时间。
可能造成泄漏的位置
生命周期处的 beforeCreate/created
以下是 VueJS 开发者看过无数次的说明图,我还请大家再多看一遍
在官方文档里,有这么一句话:
Since there are no dynamic updates, of all the lifecycle hooks,>beforeEach
beforeRouteUpdate
beforeEnter
beforeRouteEnter
beforeResolve
afterEach
beforeRouteEnter
Data-Prefetch 处
还需要特别注意的地方就是 Date-prefetch 的地方,里面很容易出现内存泄漏的代码。 所谓 Date-prefetch 就是自定义实现的,在SSR处提前获取第三方数据,用于绘制的过程。
Global Mixin 处
这个内存泄漏的点想必大家都已经熟知,作者也在github上详细阐述过:GitHub issue
简单来说,就是 global mixin 会给每个 Vue 实例一个拷贝,而不是引用。
内存泄漏的例子
以上列举了一些可能出现内存泄漏的地方,那么具体怎么样的代码才会引起内存泄漏呢?引起代码泄漏的例子网上有很多,我在这里想给大家介绍几种常见的泄漏例子。
不小心造成的全局变量
function foo(arg) {=,bar “却;能够is a hidden global variable"; }以上的代码会顺利运行,但是因为不小心声明了一个<代码>栏> 代码的变量。相当于:
function foo (arg), {=,window.bar “却;能够is an explicit global variable"; }生成了一个全局变量<代码> window.bar 代码>
如果不手动回收,这个全局变量会一直存在于内存中,不会被CG回收。积少成多,最后造成内存泄漏。
现在大家都是在各种模块化(CommonJS/AMD/CMD/etc . .)之后的环境下进行开发,这种全局变量的内存泄漏的问题基本上是被消除了。但是要提醒大家,由于JavaScript的各种特性,会有很多意想不到的状况发生。当摸不清头脑的时候,可以尝试从这些特性出发找到问题。
<强>被遗忘了的定时器或者回调强>
请大家先看以下的例子
var someResource =, getData (); setInterval(函数(),{ ,var node =, . getelementbyid(& # 39;节点# 39;); ,如果(节点){ ,//Do stuff  with node 以及外域。=,,node.innerHTML  JSON.stringify(外域)); ,} },,1000);VueJS SSR后端绘制内存泄漏的示例分析