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 流畅动画实现原理
Sep 08 Javascript
jQuery JSON的解析方式分享
Apr 05 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
Jan 23 Javascript
javascript数组去重的方法汇总
Apr 14 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
Aug 26 Javascript
12种JavaScript常用的MVC框架比较分析
Nov 16 Javascript
Javascript农历与公历相互转换的简单实例
Oct 09 Javascript
javascript显示系统当前时间代码
Dec 29 Javascript
使用Vuex解决Vue中的身份验证问题
Sep 28 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
Aug 20 Javascript
Node在Controller层进行数据校验的过程详解
Aug 28 Javascript
微信小程序canvas动态时钟
Oct 22 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
合作指挥官:孟斯克
2020/03/16 星际争霸
php实现邮件发送并带有附件
2014/01/24 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
微信小程序实现底部导航
2018/11/05 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
python中lambda与def用法对比实例分析
2015/04/30 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
Python绘制股票移动均线的实例
2019/08/24 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
巴西最大的巴士票务门户:Quero Passagem
2020/11/21 全球购物
维修工先进事迹
2014/05/29 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
民事辩护词范文
2015/05/21 职场文书
对公司的意见和建议
2015/06/04 职场文书
python 如何用terminal输入参数
2021/05/25 Python