容易造成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 相关文章推荐
EasySlider 基于jQuery功能强大简单易用的滑动门插件
Jun 11 Javascript
jquery操作select option 的代码小结
Jun 21 Javascript
基于jquery的跟随屏幕滚动代码
Jul 24 Javascript
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
node.js读取文件到字符串的方法
Jun 29 Javascript
JavaScript中文件上传API详解
Apr 01 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
Aug 10 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
Sep 19 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
Jun 27 Javascript
JS运算符简单用法示例
Jan 19 Javascript
Openlayers显示瓦片网格信息的方法
Sep 28 Javascript
vue3.0搭配.net core实现文件上传组件
Oct 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采集相关教程之一 CURL函数库
2010/02/15 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
2014/04/08 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
PHP目录操作实例总结
2016/09/27 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
2017/09/26 PHP
Javascript玩转继承(一)
2014/05/08 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
跟我学习javascript的异步脚本加载
2015/11/20 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
2017/01/18 Javascript
URL中“#” “?” &amp;“”号的作用浅析
2017/02/04 Javascript
Vue组件开发初探
2017/02/14 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
angular4模块中给标签添加背景图的实现方法
2017/09/15 Javascript
Python实现队列的方法
2015/05/26 Python
独特的python循环语句
2016/11/20 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
python基于Selenium的web自动化框架
2019/07/14 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
HTML5 Canvas之测试浏览器是否支持Canvas的方法
2015/01/01 HTML / CSS
家用个人磨皮机:Trophy Skin
2017/03/30 全球购物
美国高端医师级美容产品电商:BeautifiedYou.com
2017/04/17 全球购物
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
普天C++笔试题
2016/03/20 面试题
工程力学专业毕业生求职信
2013/10/06 职场文书
十佳护士获奖感言
2014/02/18 职场文书
小区推广策划方案
2014/06/06 职场文书
停水通知
2015/04/16 职场文书
我的中国梦主题班会
2015/08/14 职场文书
2016年教育局“我们的节日——端午节”主题活动总结
2016/04/01 职场文书
javascript Number 与 Math对象的介绍
2021/11/17 Javascript