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 相关文章推荐
jQuery快速上手:写jQuery与直接写JS的区别详细解析
Aug 26 Javascript
thinkphp中常用的系统常量和系统变量
Mar 05 Javascript
jQuery实现统计输入文字个数的方法
Mar 11 Javascript
js使用setTimeout实现定时炸弹的方法
Apr 10 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
Jun 26 Javascript
JavaScript记录光标在编辑器中位置的实现方法
Apr 22 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
零基础之Node.js搭建API服务器的详解
Mar 08 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
May 13 Javascript
使用Vue.observable()进行状态管理的实例代码详解
May 26 Javascript
vue发送websocket请求和http post请求的实例代码
Jul 11 Javascript
javascript中call,apply,callee,caller用法实例分析
Jul 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
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
2010/05/21 Javascript
一个原生的用户等级的进度条
2010/07/03 Javascript
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
2017/01/05 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
浅析使用Python搭建http服务器
2019/10/27 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
django 模型字段设置默认值代码
2020/07/15 Python
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
面试求职的个人自我评价
2013/11/16 职场文书
2014年物流工作总结
2014/11/25 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
高中语文教学反思范文
2016/02/16 职场文书
商业计划书格式、范文
2019/03/21 职场文书
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis