容易造成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 相关文章推荐
一步一步教你写一个jQuery的插件教程(Plugin)
Sep 03 Javascript
Web前端设计模式  制作漂亮的弹出层
Oct 29 Javascript
js调用activeX获取u盘序列号的代码
Nov 21 Javascript
使用jquery读取html5 localstorage的值的方法
Jan 04 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
Feb 19 Javascript
jQuery中val()方法用法实例
Dec 25 Javascript
JavaScript实现数据类型的相互转换
Mar 06 Javascript
通过bootstrap全面学习less
Nov 09 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
Jan 23 Javascript
vue2.0实现导航菜单切换效果
May 08 Javascript
微信小程序中进行地图导航功能的实现方法
Jun 29 Javascript
微信小程序 WXML节点信息查询详解
Jul 29 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
php 正则匹配函数体
2009/08/25 PHP
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
ajax无刷新动态调用股票信息(改良版)
2008/11/01 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
JS实现多选框的操作
2020/06/24 Javascript
Python查看多台服务器进程的脚本分享
2014/06/11 Python
在Python中使用模块的教程
2015/04/27 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
浅述python2与python3的简单区别
2018/09/19 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
HTML5 常用语法一览(列举不支持的属性)
2010/01/26 HTML / CSS
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
编辑个人求职信范文
2013/09/21 职场文书
自荐信的两点禁忌
2013/10/30 职场文书
生产厂厂长岗位职责
2013/12/25 职场文书
毕业生的自我评价
2013/12/30 职场文书
学前教育学生自荐信范文
2013/12/31 职场文书
经销商年会策划方案
2014/05/29 职场文书
企业人事任命书
2014/06/05 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
会计求职简历自我评价
2015/03/10 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书