JavaScript避免内存泄露及内存管理技巧


Posted in Javascript onSeptember 05, 2014

本文实例讲述了JavaScript避免内存泄露及内存管理技巧,非常实用。分享给大家供大家参考之用。具体方法如下:

本文内容源自谷歌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即可:

JavaScript避免内存泄露及内存管理技巧

希望本文所述对大家javascript程序设计的学习有所帮助。

Javascript 相关文章推荐
javascript 混合的构造函数和原型方式,动态原型方式
Dec 07 Javascript
Javascript面向对象扩展库代码分享
Mar 27 Javascript
JS异常处理的一个想法(sofish)
Mar 14 Javascript
js实现无限级树形导航列表效果代码
Sep 23 Javascript
jquery实现全选、反选、获得所有选中的checkbox
Sep 13 Javascript
详解AngularJS控制器的使用
Mar 09 Javascript
基于javascript实现简单的抽奖系统
Apr 15 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
Sep 19 Javascript
解析js如何获取css样式
Dec 11 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
Aug 26 Javascript
layui radio点击事件实现input显示和隐藏的例子
Sep 02 Javascript
JS实现canvas简单小画板功能
Jun 23 Javascript
javascript获取dom的下一个节点方法
Sep 05 #Javascript
原生JavaScript生成GUID的实现示例
Sep 05 #Javascript
javascript动态控制服务器控件实例
Sep 05 #Javascript
setTimeout()递归调用不加引号出错的解决方法
Sep 05 #Javascript
jQuery动态创建html元素的常用方法汇总
Sep 05 #Javascript
jquery单行文字向上滚动效果的实现代码
Sep 05 #Javascript
Javascript保存网页为图片借助于html2canvas库实现
Sep 05 #Javascript
You might like
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
用PHP进行MySQL删除记录操作代码
2008/06/07 PHP
php学习笔记之基础知识
2014/11/08 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
nodejs使用express获取get和post传值及session验证的方法
2017/11/09 NodeJs
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
[03:46]DOTA2英雄基础教程 维萨吉
2013/12/11 DOTA
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
定制FileField中的上传文件名称实例
2017/08/23 Python
Python进阶之尾递归的用法实例
2018/01/31 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
python获取array中指定元素的示例
2019/11/26 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
JBL英国官网:JBL UK
2018/07/04 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
如何整合JQuery和Prototype
2014/01/31 面试题
网站编辑求职信
2013/10/17 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python