容易造成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常用对象的方法和属性小结
Jan 24 Javascript
js鼠标及对象坐标控制属性详细解析
Dec 14 Javascript
js导航栏单击事件背景变换示例代码
Jan 13 Javascript
jQuery中:disabled选择器用法实例
Jan 04 Javascript
举例简介AngularJS的内部语言环境
Jun 17 Javascript
JS实现可点击展开与关闭的左侧广告代码
Sep 02 Javascript
浅谈Vue的加载顺序探讨
Oct 25 Javascript
layui之select的option叠加问题的解决方法
Mar 08 Javascript
vue element项目引入icon图标的方法
Jun 06 Javascript
vue打包相关细节整理(小结)
Sep 28 Javascript
javascript获取元素的计算样式
May 24 Javascript
JavaScript实现手风琴效果
Feb 18 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
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
JS学习之一个简易的日历控件
2010/03/24 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
2010/06/19 Javascript
IE6图片加载的一个BUG解决方法
2010/07/13 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
js移动端图片压缩上传功能
2020/08/18 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
Python json格式化打印实现过程解析
2020/07/21 Python
绝对经典成功的大学生推荐信
2013/11/08 职场文书
商场经理竞聘演讲稿
2014/01/01 职场文书
缓刑人员的思想汇报
2014/01/11 职场文书
网上书店创业计划书
2014/01/12 职场文书
表彰大会主持词
2014/03/26 职场文书
银行竞聘演讲稿范文
2014/04/23 职场文书
党建工作先进材料
2014/05/02 职场文书
汽车维修求职信
2014/06/15 职场文书
政风行风评议整改方案
2014/09/15 职场文书
收入及婚姻状况证明
2014/11/20 职场文书
百家讲坛观后感
2015/06/12 职场文书
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android