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操作JSON的要领总结
Dec 09 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
Jan 22 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
Dec 31 Javascript
javascript对JSON数据排序的3个例子
Apr 12 Javascript
Jquery解析json字符串及json数组的方法
May 29 Javascript
BooStrap对导航条的改造实践小结
Sep 21 Javascript
js实现悬浮窗效果(支持拖动)
Mar 09 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
Jun 21 Javascript
详解bootstrap导航栏.nav与.navbar区别
Nov 23 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
Apr 12 Javascript
Vue 解决多级动态面包屑导航的问题
Nov 04 Javascript
js 实现验证码输入框示例详解
Sep 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
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
用Node提供静态文件服务的方法
2018/07/06 Javascript
Pycharm学习教程(2) 代码风格
2017/05/02 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
聊聊python中的循环遍历
2020/09/07 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
日本高岛屋百货购物网站:TAKASHIMAYA
2019/03/24 全球购物
Shell编程面试题
2012/05/30 面试题
毕业生就业推荐信范文
2013/12/01 职场文书
自荐信需注意事项
2014/01/25 职场文书
音乐专业自荐信
2014/02/07 职场文书
经典禁毒标语
2014/06/16 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
校园安全教育心得体会
2016/01/15 职场文书
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS
Python数据处理的三个实用技巧分享
2022/04/01 Python
APP界面设计技巧和注意事项
2022/04/29 杂记