容易造成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基于jQuery的表格悬停变色/恢复,表格点击变色/恢复,点击行选Checkbox
Aug 05 Javascript
让IE8支持DOM 2(不用框架!)
Dec 31 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
Jul 03 Javascript
JS实现的通用表单验证插件完整实例
Aug 20 Javascript
基于Bootstrap重置输入框内容按钮插件
May 12 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 Javascript
分享javascript、jquery实用代码段
Oct 20 Javascript
jquery dialog获取焦点的方法
Feb 09 Javascript
ionic实现下拉刷新载入数据功能
May 11 Javascript
js断点调试经验分享
Dec 08 Javascript
基于js Canvas实现二次贝塞尔曲线
Dec 25 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
Sep 16 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
Laravel find in set排序实例
2019/10/09 PHP
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
javascript 运算数的求值顺序
2011/08/23 Javascript
禁止你的左键复制实用技巧
2013/01/04 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
微信小程序文章详情页面实现代码
2018/09/10 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
使用IPython下的Net-SNMP来管理类UNIX系统的教程
2015/04/15 Python
python 字典(dict)按键和值排序
2016/06/28 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
Python中使用遍历在列表中添加字典遇到的坑
2019/02/27 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
财务副总经理工作职责
2013/11/25 职场文书
我的动漫时代的创业计划书范文
2014/01/27 职场文书
撤诉书怎么写
2015/05/19 职场文书
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
JavaScript的function函数详细介绍
2021/11/20 Javascript