官方说明:
https://support.google.com/chrome/answer/95669?visit_id=637147583639250344-892483008&p=e_awsnap&rd=1
现象:
浏览器打开一个vue页面,当前页面使用定时器每秒调后台接口一次,长时间停留在此页面,大约半天时间,浏览器显示:喔唷,崩溃啦!
定位问题:
浏览器标题栏空白处点击右键-任务管理器,可以看到对应页面的进程的运行状况。
通过监控发现,问题页面内存持续上升,明显比其他页面高了很多,存在异常。
思考:
1、怀疑定时器导致内存上升,但是写了个很简单的定时器刷新时间,并不会导致内存上升。
2、怀疑调用接口返回的数据量过大导致内存上升,但是模拟相同数据量,通过定时器每秒生成一个随机对象也不会导致内存上升。
3、那就是接口的问题了,换另一个接口也存在同样的问题。
最后发现,调用接口时将请求存到一个全局变量的数组(为了取消请求用),而路由没有跳转,数组一直没有被清空,全局变量逐渐增大内存使用能不往上涨嘛!!!
结论:
循环调用时,往全局变量不停set值,导致浏览器内存激增。
对于定时器不停请求的请求,就不要往全局变量里面放了,万不得已的话要想办法不要让全局变量持续增大!!!
同时,使用定时器前,一定要清除上一个定时器。
// 查询无误开启定时器
clearTimeout(self.timer)
self.timer = setTimeout(() => {
if (self.timerFlag) self.getData3D()
}, 3000)
当然了每秒刷新建议使用websocket,奈何后台暂不提供。。。