最近有个项目,静置一段时间,chrome内存一直上涨。就像是这样:

内存会慢慢悄悄的往上涨,最终可以到达2000多M,直至浏览器崩溃卡死。很明显,这应该是内存泄漏了。

但是只知道内存泄漏,并不知道究竟要如何排查问题。根据经验,无非就是定时器开了没关,闭包太多不能释放,动画太多性能影响等等。这样猜来猜去,成本太高。

也许都知道chrome本身有一些工具  比如:

以上三位。

network就不说了,主要是看接口的响应时间,这部分自己看看,遇到一个靠谱的后端应该没什么大问题。着重说说,后两位。

1、Performance

这个选项卡,点开之后,长这个样子:

大概知道以上这四个按钮的作用即可。

第一个:手动垃圾回收。点一下,相当于把当前网页执行了手动的垃圾回收,js引擎会暂停下来,优先把一些不用了的变量占据的内存清空回收回来。

第二个:开始记录网页的性能表现。相当于是我们的摄像机按钮,点击开始拍摄视频。它会记录下当前网页的性能表现,甚至精细到可以看到某个变量函数或者对象的内存占用情况。(注意,不要记录太长时间,会导致浏览器卡顿的)

第三个和第四个,从图标上就可以看出,一个是刷新,一个是删除所有记录。

下边开始使用分析了:

我们现在是怀疑内存泄漏了,所以再开始记录之前先手动回收一下,也就是先点击1这个按钮。

回收之后,开始点击2这个按钮,开始记录网页的表现。(还是那句话,不要记录太久,会卡的)

大概三四秒之后,可以点击暂停了(还是2这个按钮)。可以得到像下边的这个界面

第一个部分是概览。给你分析一下,杠杆这几秒钟时间花在了哪里。你可以根据这个大致定位,哪部分花费的时间比较多,一般多用于首屏时间的优化。

scripting就是js代码运行的。rendering就是渲染的时间。painting就是绘制dom的时间。 system就是系统时间。idle就是系统空闲时间。

第二部分是综合性能部分。看后边主要是三个部分 FPS 、CPU 、NET。FPS喜欢打游戏的朋友可能会更了解,就是掉帧。简单的说就是现在画面卡不卡。到底怎么看卡不卡,直接看红红绿绿的这些个折线图。红色的部分,那肯定是卡了,绿色部分相对比较平稳。根据这块可以看看到底哪个地方卡顿了,有时候可以针对解决一下。CPU这块的折线图,同样反映了究竟是哪部分在占用cpu。有几个颜色分别对应了上边的这个地方,如图

NET是网络部分,不再细说。

第三部分是堆内存的占用情况。同样的也是一个曲线,很直观可以看到从哪里开始,内存上升了,哪里开始内存下降了。如图,可以看到尾部上升了。

用鼠标划过这个阶段可以看到对应的界面绘制的过程,就知道在绘制哪个部分是有内存的提升。

第四部分是堆内存的占用情况。对应有几个部分,js 内存占用、整个文档占用、dom节点占用、监听事件以及GPU内存占用。

可以看到尾部几条曲线,dom节点(绿色)攀升起来,后边一直很高;js内存占用情况同样是一波三折;然后是监听事件也比较高。我们可以选择其中的想看的位置,鼠标点击一下,看看详情:

可以看到下边出现了详情。

根据字面意思,

第一个是 Animation,就是动画部分;后边还有具体代码的位置,可以点击去看看。

第二个是重新计算样式,说明这个地方我们重绘了dom,改变位置或者颜色什么的。

下边就是update layer,更新图层。至于更新了哪些,你可以用鼠标滑动上边的截图看看。

经过查看,发现这部分比较高的地方就是绘制echarts和某些元素在滚动显示

可以针对性看看这部分功能和代码,是否有优化的空间。

performance的使用暂时先介绍到这里。(里边还是有很多其他强大的功能的!!)。

2、Memory

这部分很明显是针对内存的。第三部分,显示的数字就是当前占用的内存。

第一部分是抓取内存快照。就是对现在的内存情况拍个照,然后显出所有占据内存的东西。选中,然后点击下边的蓝色按钮,开始拍照。可以得到类似于第四部分的快照,点进去就可以看详情了:

点击某个内容,可以在下方看到具体细节。比如上图,点击之后,下边出现了 nextick ,行末还有具体的代码位置,可以点击去看看,这部分内存的占据是否是必要的。

但是,内存泄漏的时候,是可以看到第三部分的数字不断增加的。

我们要在内存涨上去的时候,再拍一个快照,用于对比前后出现的增量,以便我们排查问题。再来一次快照。如图:

如上,比较之后,可以在下图看到增量(哪些东西增长了)

size Delta 就是变化的量 就是数学符好 Δ。

既然增加了这么多,就看看前边那些地方增加了。

排在前几个是array数据中的数组类型),closure大名鼎鼎的闭包)。点开之后,还是可以看详情的,

随便点开一个,可以看到是3D模型对象mesh in window。说明这个变量是在window下的,全局变量用着爽,但是很容易引起闭包啊,闭包可就难回收了。这个要注意。

就这样,一层层的拨开他的心,看看到底哪些增量。哪些是可以优化掉的。

性能优化是一个极其浪费时间和耐心的工作。网上的资源也不是很多,不是很系统。通过自己的项目实战,有了以上的经验,可能也不全对,欢迎指正。

但是根据这次性能优化的经验看,出现内存泄漏主要考虑几个方面:

1、数据

这里的数据值得是大量的数据。尤其是vue框架,你放在data里边的数据都会被代理(proxy)或者是劫持,通过观察者模式变成响应式的。如果你的数据量较大,这时候要考虑它是不是需要响应变化,如果不需要,就不要放进data的return对象中。如果需要,那么和后台或者产品经理考虑协商一下,是不是可以减少数据量的返回。

2、定时器

实际上,前端提到定时器,不由虎躯一震。一个小小的定时器,就可能引起真个浏览器的崩溃。原因在于,你注册一个定时器之后,他会一直存在你的页面中,只要你不摧毁页面,他就一直都在。尤其是当你的界面需要一直打开(比如说大屏展示界面),那么这个问题就会存在。所以,用到大量的定时器的时候,可以考虑定时清空一下定时器(重置一下)。如果,项目不是一直打开的,那么需要在页面destory的时候,clearInterval要注意写上了。

3、闭包

虽然放在最后,但是这个闭包真的真的真的很重要。有很多人对于闭包甚至还一知半解,所以不知不觉写了很多闭包。比如,你绑定事件的时候,用的是匿名函数。再比如,喜欢用全局变量,然后又在很多函数中引用这个变量,再比如上边的定时器,实际上也容易引起闭包问题。只要有闭包,那肯定内存噌噌噌的往上涨。毕竟占着内存不能释放,这就是隐患。

好了,分享到这里基本结束。这里提及的性能分析肯定远远不能覆盖全部场景,只作为个人项目经验的总结,欢迎探讨指正。

【chrome devtools】前端性能分析之chrome devtools的使用 前端项目内存性能优化的建议 前端浏览器崩溃卡死 前端性能分析实战相关推荐

  1. Chrome浏览器通过EasyPlayer播放多路flv视频流后浏览器崩溃是什么原因?

    EasyPlayer播放器系列项目是TSINGSEE青犀视频开发的极具开放性的播放器项目,用户可以根据自己的需求调用接口或者进行开发,实用性强,稳定性也非常优越,很多用户调用EasyPlayer播放器 ...

  2. 【前端基础知识】chrome安装React Devtools

    转载地址:https://blog.csdn.net/wp_boom/article/details/79011177 去git上下载react-devtools文件到本地,下载地址: https:/ ...

  3. 前端开发常用的Chrome插件推荐

    谷歌浏览器简单清爽的界面.因其丰富的插件,成为前端开发者喜欢的浏览器.而易用的插件可以帮助开发者减少开发过程中的大量工作量,带来更加强大的效果.今天给大家推荐几个在程序员中口碑不错非常实用的Chrom ...

  4. 谷歌Chrome浏览器自动翻译导致前端页面数据错乱问题

    谷歌Chrome浏览器自动翻译导致前端页面数据错乱问题(避雷) 浏览器的自动翻译会影响页面数据展示 因为我呢用的谷歌浏览器,有时候需要查看英文文档,平时会开着自动翻译翻译,如图: 然后今天在写网页的时 ...

  5. CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  6. devtools,不要下载旧的devtools

    你是否安装vue的时候经历过这种错误 你是否安装vue的时候经历过这种错误 点击不知道从哪里下载的devtools的时候会发现跳转到360浏览器或者其他浏览器上 又或者按照别的教程辛辛苦苦的到chro ...

  7. javascript,chrome与幽灵攻击---JavaScript,chrome with Spectre Attacks

    javascript,chrome与幽灵攻击 ----JavaScript,chrome with Spectre Attacks 本文主要介绍曾经沸沸扬扬的CPU幽灵及熔断漏洞,以幽灵漏洞为主.之后 ...

  8. python chrome headless_使用Python控制Headless Chrome

    首先要解释一下 Headless Chrome,通俗的讲就是运行一个没有GUI的Chrome,在 Headless Chrome 出现以前有 PhantomJS ,但是自从 Headless Chro ...

  9. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

最新文章

  1. Nginx源代码分析 - 日志处理
  2. “雪花”项目:Microsoft探索在.NET中实现手工内存管理
  3. 大数据处理过程中,如何让Hadoop运行得更快一些?
  4. 华为自研编程语言「仓颉」火上热搜,已正式开启内测,成员辟谣:不是中文编程...
  5. 数字旅游解决方案_迪庆州首个数字旅游小镇5G基站在巴拉格宗开通
  6. ES6 class继承
  7. [原]android解析pdf文件muPdf
  8. css3中transform中的translate(),scale(),skew(),一个参数时的情况
  9. gdb调试daemon程序
  10. cocos2dx-lua 骨骼动画spine使用心得(cocos2dx版本 3.17 spine版本3.6.53)
  11. 如何将Win7便签添加到桌面快捷方式
  12. FastAPI 教程翻译 - 介绍
  13. Behavior Creator 行为树可视化编辑器
  14. 按键精灵开发传奇手游教程-现在比较火的美杜莎传奇为例
  15. 【渝粤题库】陕西师范大学200941小学数学教学论 作业(高起专)
  16. 思维导图 基础篇(07)擎绘系统-阅读导图
  17. 订单导出(1688)
  18. 51单片机复习程序例举004--HD44780控制的1602LCD
  19. QCustomPlot 连续快速地调用replot()改善速度
  20. rockchip中的vop

热门文章

  1. 常见电子书格式及其反编译思路
  2. hy_interactive_tool学习笔记
  3. 乌镇世界互联网大会重点关注网络安全建设,声纹识别技术或成关键
  4. 青莲云亮相2018工业互联网大会,分享边缘安全技术实践
  5. 读书笔记 - 《首先,打破一切常规》
  6. 关于STM32与GSM模块之间简单应用
  7. 百度地图导入kml、kmz文件自动纠偏预览版本
  8. 无线网络管理器到底都有谁在使用
  9. VVC编码工具之Inter Prediction
  10. jsp+ssm计算机毕业设计党建工作信息管理系统【附源码】