前端内存监控 —— 使用Performance工具

目录

  • 内存管理为什么要监控??
  • Performance工具使用流程
  • 内存问题
    • 产生内存问题的现象及本质
    • 界定内存问题的标准
  • 监控内存的几种方式
    • 浏览器任务管理器
    • Timeline时序图记录
    • 堆快照查找分离DOM(可以观察内存泄露)
      • DOM存在的几种状态?
      • 实例
      • 怎么处理分离DOM?
    • 判断是否存在频繁的垃圾回收(需要用不同的工具)
      • 为什么要判断?
      • 具体怎么用监控判断?

这里讲到的是使用Performance工具去进行监视内存和垃圾回收的情况,如果对内存管理,垃圾回收以及GC不太懂的请参考文章JavaScript —— 内存管理及垃圾回收 , 下面开始进入正题

内存管理为什么要监控?

GC的目的是为了实现内存空间的良性循环,良性循环的基石是对内存空间合理使用。因为HTML中没有提供内存操作的API,所以时刻关注内存变化才能确定是否合理,我们可以通过Performance这个工具定位问题所在,Performance工具提供多种监控方式,可以时刻监控内存。

Performance工具使用流程

  1. 打开浏览器输入目标网址,这里用Chrome
  2. 进入开发人员工具面板,选择性能Performance
  3. 开启录制功能,访问具体界面
  4. 执行用户行为,一段时间后停止录制
  5. 获得报告,分析界面中记录的内存信息
序列 01.gif

下面的截图,可以看到内存Memory的选项出来的折线图就表示了内存的时候情况,有升有降就是正常的工作:

image

内存问题

产生内存问题的现象及本质

限定当前网络问题正常的情况下:

出现的现象 存在的问题
页面出现延迟加载或者经常性暂停 内存有问题,与GC频繁的垃圾回收操作是有关联的,一定存在代码中有让内存爆掉的情况
页面持续性出现糟糕的性能 存在内存膨胀,当前界面为了达到最佳使用速度,会申请一定的内存空间,这个内存空间大小超过了上限
页面的性能随时间延长越来越差 伴随内存泄露

界定内存问题的标准

  • 内存泄露 :内存使用持续升高
  • 内存膨胀 :当前应用程序本身为了达到最优效果需要一定的内存空间,也许与当前设备本身硬件不支持有关,所以产生了性能上的差异,需要去判断是程序的问题还是设备的问题。需要多做测试,在多数设备上都存在性能问题说明程序本身有问题。
  • 频繁垃圾回收 :通过内存变化图进行分析

监控内存的几种方式

浏览器任务管理器

以数值的形式将程序在执行的过程中内存的变化提现出来

在浏览器中 -> shift+Esc -> 右键选中【JavaScript使用的内存】

image
  • 第一列的内存是原生内存【DOM节点占据的内存】,这个数据增大表示创建了新的DOM节点。
  • 最后一列JavaScript内存是堆内存,界面中所有可达对象正在使用的内存大小。这个数据增大表示要么在创建新对象,要么对象在不断的增长。

下面进行一下实例:

<!--创建一个长度很大的数组-->
<body>
  <button id="add">Add</button>
  <script>
    const add = document.getElementById('add')
    add.onclick = function() {
      let arrList = new Array(1000000)
    }
  </script>
</body>
image
image

点击按钮知道内存会增大,是因为我们创建了很大的数组。之后的脚本,可以拿这个去进行监控。

Timeline时序图记录

上面的方法只能说我们的内存存在问题,但是无法更精确的定位什么时间发生的,和那些代码有关系。我们可以通过Timeline时序图直接把当前应用程序的走势以时间点的方式呈现出来。

下面进行一下实例:

<body>
  <button id="btn">Add</button>
  <script>
    const arrList = []
    function test() {
      for( let i = 0 ; i < 100000; i++) {
        document.body.appendChild(document.createElement('p'))
      }
      arrList.push(new Array(1000000).join('x'))
    }

    document.getElementById('btn').addEventListener('click',test)
  </script>
</body>

进入页面,打开performance进行录制,点击三次按钮,停止录制。

image

可以看到内存是正常的,有升有降,降的地方就是GC在工作了。如果没有降的地方,就是有问题的地方。

堆快照查找分离DOM(可以观察内存泄露)

堆快照是很有针对性的查找当前的界面对象中是否存在一些分离的DOM,分离DOM的存在也就是存在内存泄漏。
所以先搞清楚一下 什么是分离DOM?DOM存在的几种状态?

DOM存在的几种状态?

  • 界面元素存活在DOM树上
  • 垃圾对象时的DOM节点 —— DOMDOM树上脱离了,js里面也没有引用。
  • 分离状态的DOM节点 —— DOMDOM树上脱离了,js里面有引用,界面上看不见,存在内存里面。

实例

下面实例看一下,下面创建了ulli,这里没有在页面中呈现,但是代码中有引用,这些就是分离DOM

<!---->
<body>
  <button id="btn">Add</button>
  <script>
    var tmpEle

    function fn() {
      var ul = document.createElement('ul')
      for (var i = 0; i < 10; i++) {
        var li = document.createElement('li')
        ul.appendChild(li)
      }
      tmpEle = ul
    }

    document.getElementById('btn').addEventListener('click',fn)
  </script>
</body>

打开浏览器 -> Memory -> Profiles -> Heap snapshot -> Take snapshot

image

点击Add按钮 -> Take snapshot -> 可以看到多出来的ul标签和li标签,这个就是分离DOM

image

怎么处理分离DOM?

函数中把temEle置为null即可

var tmpEle
function fn() {
  var ul = document.createElement('ul')
  for (var i = 0; i < 10; i++) {
    var li = document.createElement('li')
    ul.appendChild(li)
  }
  tmpEle = ul
  tmpEle = null
}

这个时候时候堆快照,分离DOM就没有了。

判断是否存在频繁的垃圾回收(需要用不同的工具)

为什么要判断?

因为GC工作时应用程序是停止的,如果当前GC频繁工作,而且时间过长的话对Web应用来说很不友好,会导致应用假死说我状态,用户使用中会感知应用有卡顿。

具体怎么用监控判断?

  1. 通过 Timeline时序图 判断,对当前性能面板中的内存走势进行监控,如果其中频繁的上升下降,就出现了频繁的垃圾回收。这个时候要定位代码,看看是执行什么的时候造成了这种情况。
  2. 使用 浏览器任务管理器 会简单一些,任务管理器中主要是数值的变化,其数据频繁的瞬间增加减小,也是频繁的垃圾回收。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容