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中的ArrayBuffer详细介绍
Dec 08 Javascript
SuperSlide标签切换、焦点图多种组合插件
Mar 14 Javascript
Javascript中的高阶函数介绍
Mar 15 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
Aug 24 Javascript
Bootstrap树形组件jqTree的简单封装
Jan 25 Javascript
jQuery unbind 删除绑定事件详解
May 24 Javascript
原生JS封装_new函数实现new关键字的功能
Aug 12 Javascript
关于RxJS Subject的学习笔记
Dec 05 Javascript
js的各种数据类型判断的介绍
Jan 19 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
Jul 04 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
Sep 06 Javascript
javascript实现左右缓动动画函数
Nov 25 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 adodb连接mssql解决乱码问题
2009/06/12 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
ASP SQL防注入的方法
2008/12/25 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
vue2.0 和 animate.css的结合使用
2017/12/12 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
jQuery操作元素追加内容示例
2020/01/10 jQuery
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
在Python中使用Neo4j数据库的教程
2015/04/16 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
python线程信号量semaphore使用解析
2019/11/30 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
实例代码讲解Python 线程池
2020/08/24 Python
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
会计顶岗实习心得
2014/01/25 职场文书
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
四群教育工作实施方案
2014/03/26 职场文书
大学生志愿者活动总结
2014/06/27 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书