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 相关文章推荐
js实现双击图片放大单击缩小的方法
Feb 17 Javascript
jQuery实现带渐显效果的人物多级关系图代码
Oct 16 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
May 05 Javascript
Vue表单实例代码
Sep 05 Javascript
jQuery简单获取DIV和A标签元素位置的方法
Feb 07 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
Apr 13 jQuery
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 Javascript
详解vue-cli下ESlint 配置说明
Sep 03 Javascript
javascript实现简易聊天室
Jul 12 Javascript
JS如何定义用字符串拼接的变量
Jul 11 Javascript
原生JS生成指定位数的验证码
Oct 28 Javascript
在Vue中使用mockjs代码实例
Nov 25 Vue.js
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
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
FLASH 广告之外的链接
2008/12/16 Javascript
JavaScript Array扩展实现代码
2009/10/14 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
js实现多选项切换导航菜单的方法
2015/02/06 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
JavaScript多线程详解
2015/08/12 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
JS调用Android、Ios原生控件
2017/01/06 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
Python爬取豆瓣视频信息代码实例
2019/11/16 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
css3 盒模型以及box-sizing属性全面了解
2016/09/20 HTML / CSS
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
德国机车企业:FC-Moto
2017/10/27 全球购物
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
what is the difference between ext2 and ext3
2015/08/25 面试题
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
我的兄弟姐妹观后感
2015/06/15 职场文书
幼儿园元旦主持词
2015/07/06 职场文书