容易造成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 相关文章推荐
取得窗口大小 兼容所有浏览器的js代码
Aug 09 Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 Javascript
让浏览器DOM元素最后加载的js方法
Jul 29 Javascript
javascript实现鼠标拖动改变层大小的方法
Apr 30 Javascript
微信小程序 九宫格实例代码
Jan 21 Javascript
jQuery事件对象的属性和方法详解
Sep 09 jQuery
IntelliJ IDEA 安装vue开发插件的方法
Nov 21 Javascript
vue.js实现只弹一次弹框
Jan 29 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
Feb 05 Javascript
vue点击当前路由高亮小案例
Sep 26 Javascript
JS替换字符串中指定位置的字符(多种方法)
May 28 Javascript
关于Node.js中频繁修改代码重启服务器的问题
Oct 15 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抽象工厂模式(Elgg)
2010/03/21 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
php网站被挂木马后的修复方法总结
2014/11/06 PHP
thinkPHP查询方式小结
2016/01/09 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
html读出文本文件内容
2007/01/22 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
angular 用Observable实现异步调用的方法
2018/12/27 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
Python记录详细调用堆栈日志的方法
2015/05/05 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
scrapy-splash简单使用详解
2021/02/21 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
初一体育教学反思
2014/01/29 职场文书
运动会邀请函范文
2014/01/31 职场文书
科技节口号
2014/06/19 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
2015年学校政教处工作总结
2015/05/26 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python