容易造成JavaScript内存泄露几个方面


Posted in Javascript onSeptember 04, 2014

发表于谷歌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即可:

更多内容请查看原文PPT。

Javascript 相关文章推荐
JavaScript之Getters和Setters 平台支持等详细介绍
Dec 07 Javascript
在新窗口打开超链接的方法小结
Apr 14 Javascript
解析使用JS 清空File控件的路径值
Jul 08 Javascript
javascript的数组和常用函数详解
May 09 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
Aug 10 Javascript
JS生成某个范围的随机数【四种情况详解】
Apr 20 Javascript
浅谈JS中json数据的处理
Jun 30 Javascript
自学实现angularjs依赖注入
Dec 20 Javascript
简单实现js悬浮导航效果
Feb 05 Javascript
jQuery滚动插件scrollable.js用法分析
May 25 jQuery
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
Sep 01 Javascript
Vuex的API文档说明详解
Feb 05 Javascript
require.js深入了解 require.js特性介绍
Sep 04 #Javascript
用console.table()调试javascript
Sep 04 #Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
Sep 04 #Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
Sep 04 #Javascript
jQuery之Deferred对象详解
Sep 04 #Javascript
Javascript Objects详解
Sep 04 #Javascript
加随机数引入脚本不让浏览器读取缓存
Sep 04 #Javascript
You might like
基于php下载文件的详解
2013/06/02 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
Angular指令之restict匹配模式的详解
2017/07/27 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
原生JS实现前端本地文件上传
2018/09/08 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
python文件和目录操作方法大全(含实例)
2014/03/12 Python
Python实现简单HTML表格解析的方法
2015/06/15 Python
使用python3实现操作串口详解
2019/01/01 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
Python 互换字典的键值对实例
2019/02/12 Python
python从入门到精通 windows安装python图文教程
2019/05/18 Python
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
2014年学校食堂工作总结
2014/11/25 职场文书
求职信格式范文
2015/03/19 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle
详解Golang如何优雅的终止一个服务
2022/03/21 Golang