容易造成JavaScript内存泄露几个方面


Posted in Javascript onSeptember 04, 2014

发表于谷歌WebPerf(伦敦WebPerf集团),​​2014年8月26日。

高效的JavaScript Web应用必须流畅,快速。与用户交互的任何应用程序,都需要考虑如何确保内存有效使用,因为如果消耗过多,页面就会崩溃,迫使用户重新加载。而你只能躲在角落哭泣。

自动垃圾收集是不能代替有效的内存管理的,特别是在大型,长时间运行的Web应用程序中。在这次讲座中,我们将演示如何通过Chrome的DevTools对内存进行有效的管理。

并了解如何解决性能问题,如内存泄漏,频繁的垃圾收集暂停,和整体内存膨胀,那些真正让你耗费精力的东西。

Addy Osmani在他的PPT中展示了很多会在Chrome V8中产生内存泄漏的示例:

1) Delete一个Object的属性会让此对象变慢(多耗费15倍的内存)

var o = { x: 'y' };

delete o.x; //此时o会成一个慢对象

o.x; //
var o = { x: 'y' };

o = null;  //应该这样

2) 闭包

在闭包中引入闭包外部的变量时,当闭包结束时此对象无法被垃圾回收(GC)。

var a = function() {

  var largeStr = new Array(1000000).join('x');

  return function() {

    return largeStr;

  }

}();

3) DOM泄露

当原有的COM被移除时,子结点引用没有被移除则无法回收。

var select = document.querySelector;

var treeRef = select('#tree');
//在COM树中leafRef是treeFre的一个子结点

var leafRef = select('#leaf');  

var body = select('body');
body.removeChild(treeRef);
//#tree不能被回收入,因为treeRef还在

//解决方法:

treeRef = null;
//tree还不能被回收,因为叶子结果leafRef还在

leafRef = null;
//现在#tree可以被释放了。

4) Timers计(定)时器泄露

定时器也是常见产生内存泄露的地方:

for (var i = 0; i < 90000; i++) {

  var buggyObject = {

    callAgain: function() {

      var ref = this;

      var val = setTimeout(function() {

        ref.callAgain();

      }, 90000);

    }

  }
  buggyObject.callAgain();

  //虽然你想回收但是timer还在

  buggyObject = null;

}

5) 调试内存

Chrome自带的内存调试工具可以很方便地查看内存使用情况和内存泄露:
在 Timeline -> Memory 点击record即可:

更多内容请查看原文PPT。

Javascript 相关文章推荐
在JavaScript中,为什么要尽可能使用局部变量?
Apr 06 Javascript
javascript 二维数组的实现与应用
Mar 16 Javascript
jQuery下的几个你可能没用过的功能
Aug 29 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
Jul 23 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
Aug 08 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
Feb 13 Javascript
js 转义字符及URI编码详解
Feb 28 Javascript
JavaScript实现前端分页控件
Apr 19 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
Mar 16 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
Jul 12 jQuery
使用NestJS开发Node.js应用的方法
Dec 03 Javascript
基于js实现抽红包并分配代码实例
Sep 19 Javascript
require.js深入了解 require.js特性介绍
Sep 04 #Javascript
用console.table()调试javascript
Sep 04 #Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
Sep 04 #Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
Sep 04 #Javascript
jQuery之Deferred对象详解
Sep 04 #Javascript
Javascript Objects详解
Sep 04 #Javascript
加随机数引入脚本不让浏览器读取缓存
Sep 04 #Javascript
You might like
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
PHP实现的同步推荐操作API接口案例分析
2016/11/30 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
JS hashMap实例详解
2016/05/26 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
2018/09/13 Javascript
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
2018/08/01 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
夜班门卫岗位职责
2013/12/09 职场文书
搞笑创意广告语
2014/03/17 职场文书
农村产权制度改革实施方案
2014/03/21 职场文书
公司股东合作协议书
2014/09/14 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
法律进社区活动总结
2015/05/07 职场文书
浅析Python OpenCV三种滤镜效果
2022/04/11 Python
JavaScript中reduce()的用法
2022/05/11 Javascript