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 相关文章推荐
Prototype 学习 工具函数学习($方法)
Jul 12 Javascript
图像替换新技术 状态域方法
Jan 28 Javascript
JavaScript EasyPager 分页函数
May 25 Javascript
jQuery .tmpl() 用法示例介绍
Aug 21 Javascript
JavaScript实现的一个计算数字步数的算法分享
Dec 06 Javascript
14个有用的Jquery技巧分享
Jan 08 Javascript
jQuery实现级联下拉框实战(5)
Feb 08 Javascript
MUI  Scroll插件的使用详解
Apr 13 Javascript
vue父组件点击触发子组件事件的实例讲解
Feb 08 Javascript
JavaScript中的回调函数实例讲解
Jan 27 Javascript
js实现ajax的用户简单登入功能
Jun 18 Javascript
JavaScript 几种循环方式以及模块化的总结
Sep 03 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
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
checkbox 多选框 联动实现代码
2008/10/22 Javascript
jquery 表单进行客户端验证demo
2009/08/24 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
js获取鼠标点击的位置实现思路及代码
2014/05/09 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
Python修改文件往指定行插入内容的实例
2019/01/30 Python
利用Python绘制有趣的万圣节南瓜怪效果
2019/10/31 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
python简单的三元一次方程求解实例
2020/04/02 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
斯凯奇澳大利亚官网:SKECHERS澳大利亚
2018/03/31 全球购物
大学活动总结模板
2014/07/10 职场文书
毕业生应聘求职信
2014/07/10 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL