容易造成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 去字符串空格终极版(支持utf8)
Nov 14 Javascript
javascript Array.prototype.slice使用说明
Oct 11 Javascript
JS可以控制样式的名称写法一览
Jan 16 Javascript
jquery选择器需要注意的问题
Nov 26 Javascript
JavaScript中用字面量创建对象介绍
Dec 31 Javascript
ExtJs动态生成treepanel的Json格式
Jul 19 Javascript
浅谈javascript的Array.prototype.slice.call
Aug 31 Javascript
Javascript打印局部页面实例
Jun 21 Javascript
Angular项目从新建、打包到nginx部署全过程记录
Dec 09 Javascript
JS中Map和ForEach的区别
Feb 05 Javascript
对angular 监控数据模型变化的事件方法$watch详解
Oct 09 Javascript
详解Vue底部导航栏组件
May 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
php开启安全模式后禁用的函数集合
2011/06/26 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
PHP制作用户注册系统
2015/10/23 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
PHP简单读取xml文件的方法示例
2017/04/20 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
THREE.JS入门教程(1)THREE.JS使用前了解
2013/01/24 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
小程序日历控件使用方法详解
2018/12/29 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
tornado捕获和处理404错误的方法
2014/02/26 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
python+VTK环境搭建及第一个简单程序代码
2017/12/13 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
Python将string转换到float的实例方法
2019/07/29 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
小学生学习感言
2014/03/10 职场文书
王老吉广告词
2014/03/20 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
思想政治表现评语
2015/01/04 职场文书
协议书范文
2015/01/27 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
2016年小学生寒假总结
2015/10/10 职场文书