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 12 Javascript
基于jquery的jqDnR拖拽溢出的修改
Feb 12 Javascript
利用js实现遮罩以及弹出可移动登录窗口
Jul 08 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
Oct 29 Javascript
jQuery实现文本框邮箱输入自动补全效果
Nov 17 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
Apr 20 Javascript
PHP7新特性简述
Jun 11 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
Aug 07 Javascript
Angular6 用户自定义标签开发的实现方法
Jan 08 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
Apr 10 Javascript
如何利用React实现图片识别App
Feb 18 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/02 国漫
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
js实现轮播图的完整代码
2020/10/26 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
一篇不错的Python入门教程
2007/02/08 Python
在Django中限制已登录用户的访问的方法
2015/07/23 Python
Python ldap实现登录实例代码
2016/09/30 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
keras 多gpu并行运行案例
2020/06/10 Python
web页面录屏实现
2019/02/12 HTML / CSS
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
电脑专业个人求职信范文
2014/02/04 职场文书
给学校的建议书
2014/03/12 职场文书
大学生求职计划书
2014/04/30 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
预备党员综合考察材料
2014/05/31 职场文书
园林系毕业生求职信
2014/06/23 职场文书
小学运动会演讲稿
2014/08/25 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
教师个人教学反思
2016/02/23 职场文书