js 内存泄漏

Posted 立心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 内存泄漏相关的知识,希望对你有一定的参考价值。

javascript中,我们很少去关注内存的管理。我们创建变量,使用变量,浏览器关注这些底层的细节都显得很正常。

但是当应用程序变得越来越复杂并且ajax化之后,或者用户在一个页面停留过久,我们可能需要去注意一些问题,如一个浏览器花费了1G以上的内存,并且在不断的增加。这些问题常常都是因为内存泄露引起。

Javascript 内存泄露

这个javascript内存管理的核心概念就是具不具有可达性的概念。

1 一个明显的对象集合将会被认为是可达的:这些对象是被知道的像roots一样。

包括那些所有的对象在堆栈中个地方被引用(包括,所有的局部变量,正在被调用的方法的中的参数),以及任何的全局变量。

2 对象保存在内存中,他们是可以到达的从roots 对象,通过一个引用货者一个引用链。

 

这里有一个GC 垃圾回收器在浏览器中,用来清楚没有用的对象在内存中。

 

垃圾回收example

 

1
2
3
4
5
6
7
8
9
10
function Menu(title) {
  this.title = title
  this.elem = document.getElementById(\'id\')
}
 
var menu = new Menu(\'My Menu\')
 
document.body.innerhtml = \'\'  // (1)
 
menu = new Menu(\'His menu\') // (2)

 

 

来看一下内存结构:

\\

 

在step(1) 中,Body.innerHTML 被清除掉,所以它的子节点也会被删除,因为他们不再被关联。

但是这个元素#id 是一个例外,他是是被 menu.elem 关联着,所以该对象会一直存在内存中,当然 ,如果你检查他的parentNode, 将会得到一个null值。

 

注意:个别的Dom元素 可以会保存在内存中即使他们的parent 被移除了。

在step(2) 中,引用window.menu 被定义,所以之前的 menu因为不再被关联,它将会自动被移除通过浏览器的GC。

\\

 

循环引用集合

闭包经常会导致循环引用,例如:

 

1
2
3
4
5
6
7
8
9

(c)2006-2024 SYSTEM All Rights Reserved IT常识