容易造成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 相关文章推荐
经典的带阴影的可拖动的浮动层
Jun 26 Javascript
根据分辨率不同,调用不同的css文件
Aug 25 Javascript
常规表格多表头查询示例
Feb 21 Javascript
jQuery带箭头提示框tooltips插件集锦
Nov 17 Javascript
jQuery中hide()方法用法实例
Dec 24 Javascript
javascript面向对象之对象的深入理解
Jan 13 Javascript
JS+CSS实现可拖动的弹出提示框
Feb 16 Javascript
jQuery将表单序列化成一个Object对象的实例
Nov 29 Javascript
JS实现简单的二元方程计算器功能示例
Jan 03 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
Mar 09 Javascript
react 不用插件实现数字滚动的效果示例
Apr 14 Javascript
JavaScript实现动态生成表格
Aug 02 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
打造计数器DIY三步曲(中)
2006/10/09 PHP
php discuz 主题表和回帖表的设计
2009/03/13 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
php图片添加水印例子
2016/07/20 PHP
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
javascript Select标记中options操作方法集合
2008/10/22 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
HTTP 304错误的详细讲解
2013/11/13 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
JS实现简单打字测试
2020/06/24 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
python多线程同步之文件读写控制
2021/02/25 Python
python 伯努利分布详解
2020/02/25 Python
python关于倒排列的知识点总结
2020/10/13 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
班长岗位职责
2013/11/10 职场文书
医学专业五年以上个人求职信
2013/12/03 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
民间借贷被告代理词
2015/05/23 职场文书
如何书写邀请函?
2019/06/24 职场文书
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB