容易造成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的15款幻灯片插件
Apr 10 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
Dec 13 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
Jul 31 Javascript
一个JavaScript的求爱小特效
May 09 Javascript
微信小程序 地图定位简单实例
Oct 14 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
Dec 08 Javascript
基于jquery实现二级联动效果
Mar 30 jQuery
微信小程序 request接口的封装实例代码
Apr 26 Javascript
微信小程序常用赋值方法小结
Apr 30 Javascript
Node.js 多进程处理CPU密集任务的实现
May 26 Javascript
通过实例解析js简易模块加载器
Jun 17 Javascript
layui layer select 选择被遮挡的解决方法
Sep 21 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合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
php 伪造本地文件包含漏洞的代码
2011/11/03 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
php采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
Django 用户认证组件使用详解
2019/07/23 Python
Series和DataFrame使用简单入门
2019/11/13 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
房屋租赁合同解除协议书
2014/10/11 职场文书
员工家属慰问信
2015/03/24 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python