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 相关文章推荐
js获取提交的字符串的字节数
Feb 09 Javascript
js中top/parent/frame概述及案例应用
Feb 06 Javascript
将list转换为json失败的原因
Dec 17 Javascript
js漂浮广告实现代码
Aug 15 Javascript
深入解析Javascript闭包的功能及实现方法
Jul 10 Javascript
jquery事件绑定解绑机制源码解析
Sep 19 Javascript
javascript自执行函数
Feb 10 Javascript
jquery中封装函数传递当前元素的方法示例
May 05 jQuery
用vue的双向绑定简单实现一个todo-list的示例代码
Aug 03 Javascript
浅谈一种让小程序支持JSX语法的新思路
Jun 16 Javascript
JS forEach跳出循环2种实现方法
Jun 24 Javascript
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
Apr 13 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用户指南-cookies部分
2006/10/09 PHP
基于Zookeeper的使用详解
2013/05/02 PHP
基于PHP常用字符串的总结(待续)
2013/06/07 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
10条php编程小技巧
2015/07/07 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
比较简单实用的使用正则三种版本的js去空格处理方法
2007/11/18 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
自定义javascript验证框架示例【附源码下载】
2019/05/31 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
Python之os操作方法(详解)
2017/06/15 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
项目工作说明书
2014/07/29 职场文书
党支部四风整改方案
2014/10/25 职场文书
聚会通知怎么写
2015/04/23 职场文书
Redis集群的关闭与重启操作
2021/07/07 Redis