javascript内存泄露

垃圾回收机制

JavaScript不需要手动地释放内存,它使用一种自动垃圾回收机制(garbage collection)。当一个对象无用的时候,即程序中无变量引用这个对象时,就会从内存中释放掉这个变量



循环引用

三个对象 A 、B 、C

A->B->C :A的某一属性引用着B,同样C也被B的属性引用着。如果将A清除,那么B、C也被释放。

A->B->C->B :这里增加了C的某一属性引用B对象,如果这是清除A,那么B、C不会被释放,因为B和C之间产生了循环引用。

 1  var a = {};
 2     a.pro = { a:100 };
 3     a.pro.pro = { b:100 };
 4     a = null ;
 5     //这种情况下,{a:100}和{b:100}就同时也被释放了。
 6
 7     var obj = {};
 8     obj.pro = { a : 100 };
 9     obj.pro.pro = { b : 200 };
10     var two = obj.pro.pro;
11     obj = null;
12     //这种情况下 {b:200}不会被释放掉,而{a:100}被释放了。


循环引用和闭包

1 function outer(){
2         var obj = {};
3         function inner(){
4             //这里引用了obj对象
5         }
6         obj.inner = inner;
7     }

DOM循环引用

function SetupLeak()
{
myGlobalObject = document.getElementById("LeakedDiv");
document.getElementById("LeakedDiv").expandoProperty = myGlobalObject;
}
 


 IE下的内存泄露

在IE下的JS编程中,以下的编程方式都会造成即使关闭IE也无法释放内存的问题,下面分类给出:

1、给DOM对象添加的属性是一个对象的引用。范例: 
var MyObject = {}; 
document.getElementById(‘myDiv‘).myProp = MyObject; 
解决方法: 
在window.onunload事件中写上: document.getElementById(‘myDiv‘).myProp = null;

2、DOM对象与JS对象相互引用。范例: 
function Encapsulator(element) { 
this.elementReference = element; 
element.myProp = this; 

new Encapsulator(document.getElementById(‘myDiv‘)); 
解决方法: 
在onunload事件中写上: document.getElementById(‘myDiv‘).myProp = null;

3、给DOM对象用attachEvent绑定事件。范例: 
function doClick() {} 
element.attachEvent("onclick", doClick); 
解决方法: 
在onunload事件中写上: element.detachEvent(‘onclick‘, doClick);

4、从外到内执行appendChild。这时即使调用removeChild也无法释放。范例: 
var parentDiv = document.createElement("div"); 
var childDiv = document.createElement("div"); 
document.body.appendChild(parentDiv); 
parentDiv.appendChild(childDiv); 
解决方法: 
从内到外执行appendChild: 
var parentDiv = document.createElement("div"); 
var childDiv = document.createElement("div"); 
parentDiv.appendChild(childDiv); 
document.body.appendChild(parentDiv);

5、反复重写同一个属性会造成内存大量占用(但关闭IE后内存会被释放)。范例: 
for(i = 0; i < 5000; i++) { 
hostElement.text = "asdfasdfasdf"; 

这种方式相当于定义了5000个属性!



总结一下,内存泄露分为四类:

1、循环引用(Circular References) — IE浏览器的COM组件产生的对象实例和网页脚本引擎产生的对象实例相互引用,就会造成内存泄漏。


这也是Web页面中我们遇到的最常见和主要的泄漏方式;

2、内部函数引用(Closures) — Closures可以看成是目前引起大量问题的循环应用的一种特殊形式。由于依赖指定的关键字和语法结构,

Closures调用是比较容易被我们发现的;

3、页面交叉泄漏(Cross-Page Leaks) — 页面交叉泄漏其实是一种较小的泄漏,它通常在你浏览过程中,由于内部对象薄计引起。下面我们

会讨论DOM插入顺序的问题,在那个示例中你会发现只需要改动少量的代码,我们就可以避免对象薄计对对象构建带来的影响;

4、貌似泄漏(Pseudo-Leaks) — 这个不是真正的意义上的泄漏,不过如果你不了解它,你可能会在你的可用内存资源变得越来越少的时候极

度郁闷。为了演示这个问题,我们将通过重写Script元素中的内容来引发大量内存的"泄漏"。 

详细可以参照:http://www.cnblogs.com/carekee/articles/1733847.html

时间: 2025-01-06 15:55:43

javascript内存泄露的相关文章

[ Javascript ] 内存泄露以及循环引用解析

内存泄露 在javascript中,我们非常少去关注内存的管理. 我们创建变量,使用变量,浏览器关注这些底层的细节都显得非常正常. 可是当应用程序变得越来越复杂而且ajax化之后,或者用户在一个页面停留过久,我们可能须要去注意一些问题.如一个浏览器花费了1G以上的内存,而且在不断的添加. 这些问题经常都是由于内存泄露引起. Javascript 内存泄露 这个javascript内存管理的核心概念就是具不具有可达性的概念. 1 一个明显的对象集合将会被觉得是可达的:这些对象是被知道的像roots

4类 JavaScript 内存泄露及如何避免

原文:4 Types of Memory Leaks in JavaScript and How to Get Rid Of Them笔记:涂鸦码龙 译者注:本文并没有逐字逐句的翻译,而是把我认为重要的信息做了翻译.如果您的英文熟练,可以直接阅读原文. 本文将探索常见的客户端 JavaScript 内存泄露,以及如何使用 Chrome 开发工具发现问题. 简介 内存泄露是每个开发者最终都要面对的问题,它是许多问题的根源:反应迟缓,崩溃,高延迟,以及其他应用问题. 什么是内存泄露? 本质上,内存泄

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

高效的JavaScript Web应用必须流畅,快速.与用户交互的任何应用程序,都需要考虑如何确保内存有效使用,因为如果消耗过多,页面就会崩溃,迫使用户重新加载.而你只能躲在角落哭泣. 自动垃圾收集是不能代替有效的内存管理的,特别是在大型,长时间运行的Web应用程序中.在这次讲座中,我们将演示如何通过Chrome的DevTools对内存进行有效的管理. 并了解如何解决性能问题,如内存泄漏,频繁的垃圾收集暂停,和整体内存膨胀,那些真正让你耗费精力的东西. Addy Osmani在他的PPT中展示了

JavaScript垃圾回收(三)——内存泄露

一.JavaScript内存监测工具 在讨论内存泄露之前,先介绍几款JavaScript内存监测工具. IE的sIEve与JSLeaksDetector(这两个可以在下面的附件中下载),firefox的Leak Monitor,chrome的Porfiles等. 1.Leak Monitor好不容易找到下载链接,但是我的firefox的版本安装不了. 2.chrome的Porfiles,点击F12就能看到,如下图所示: 3.IE的JSLeaksDetector,我用的是win7系统,后面发现64

关于JavaScript的内存泄露检测

今天我遇到一个浏览器crash的问题,怀疑可能是JavaScript内存泄露了.然后网上搜了下,找到了Chrome中调试JavaScript内存泄露的方法 先打开Chrome开发者工具.以打开一个标签页为例.打开然后关闭此标签页一次,确保此标签页需要的资源都加载过了.然后进入开发者工具的Profiles标签页,选择Take Heap Snapshot,并Start.然后浏览器就会记录下当前页面的JavaScript所有对象的快照.然后再次打开关闭上述标签页,然后重复捕获JavaScript对象快

javascript 内存泄漏的学习

概念 内存泄漏: 用动态存储分配函数动态开辟的空间,在使用完毕后未释放, 木有任何指针指向他,结果导致一直占据该内存单元.直到程序结束.(其实说白了就是该内存空间使用完毕之后未回收, 占着茅坑不**)即所谓内存泄漏. 等所有内存都被占完之后, 系统就跪了. 内存分配方式 说道内存泄露,就不得不谈到内存分配的方式.内存分配有三种方式,分别是: 一.静态分配( Static Allocation ):静态变量和全局变量的分配形式.如果把房间看做一个程序,我们可以把静态分配的内存当成是房间里的耐用家具

JavaScript 的垃圾回收与内存泄露

JavaScript采用垃圾自动回收机制,运行时环境会自动清理不再使用的内存,因此javascript无需像C++等语言一样手动释放无用内存. 在这之前先说一下垃圾回收的两种方式:引用计数与标记清除. 引用计数方式会为每个已分配内存单元设置计数器,当计数器减少到0的时候就意味着该单元无法再被引用,将会被清除. 有一个问题是,当存在循环引用时,内存单元的计数器将永远不为0,内存的释放会比较复杂(需要使用到弱引用). 1 obj.val = obj2; 2 obj2.val = obj; 标记清除方

[转载] js内存泄露的几种情况——javascript系列

想解决内存泄露问题,必须知道什么是内存泄露,什么情况下出现内存泄露,才能在遇到问题时,逐个排除.这里只讨论那些不经意间的内存泄露. 一.什么是内存泄露 内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束.在C++中,因为是手动管理内存,内存泄露是经常出现的事情.而现在流行的C#和Java等语言采用了自动垃圾回收方法管理内存,正常使用的情况下几乎不会发生内存泄露.浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有bug,会产生内存泄露. 二.内存泄露的几种情况

JavaScript中易犯的小错误-------常见错误三:内存泄露

国庆放假,今天开始继续!!!!!!!!!!! JavaScript中易犯的小错误-------常见错误三:内存泄露 内存泄露在js变成中几乎是一个无法避免的问题.如果不是特别细心的话,在最后的检查过程中,肯定会出现各种内存泄露问题.下面我们就来举例说明一下:var theThing = null;var replaceThing = function () {     var priorThing = theThing;     var unused = function () {