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 获取字符串字节数的多种方法
Jun 02 Javascript
JavaScript Event学习第三章 早期的事件处理程序
Feb 07 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
Jun 19 Javascript
JavaScript 字符串处理函数使用小结
Dec 02 Javascript
js中关于String对象的replace使用详解
May 24 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
Dec 11 Javascript
jQuery中map()方法用法实例
Jan 06 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
Aug 15 Javascript
vue2笔记 — vue-router路由懒加载的实现
Mar 03 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
Sep 20 Javascript
详解JavaScript的数据类型以及数据类型的转换
Apr 20 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
Sep 24 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
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
php数组键值用法实例分析
2015/02/27 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
php适配器模式简单应用示例
2019/10/23 PHP
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
2017/01/13 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
Python创建系统目录的方法
2015/03/11 Python
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
Python如何根据时间序列数据作图
2020/05/12 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
Django中使用Celery的方法步骤
2020/12/07 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
别名指示符是什么
2012/10/08 面试题
公证书标准格式
2014/04/10 职场文书
核心价值观演讲稿
2014/05/13 职场文书
销售团队激励口号
2014/06/06 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
电话营销开场白
2015/05/29 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
ipad隐藏软件app图标方法
2022/04/19 数码科技