JS内存泄露

JavaScript029

JS内存泄露,第1张

当内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。Chrome限制了浏览器所能使用的内存极限,64位为1.4GB,32位为1.0GB。

1.意外的全局变量

.未声明变量

.使用this创建的变量(this指向window)

解决办法:

.避免创建全局变量

.使用严格模式,在js文件头部或者函数的顶部加上use strict

2.闭包引起的内存泄露

原因:闭包可以读取函数内部的变量,然后让这些变量是始终保存在内存中。如果在使用结束后没有将局部变量清除,就可能导致内存泄露。

解决:将事件处理函数定义在外部,解除闭包,或者在定义事件处理函数的外部函数中。

3.没有清除的DOM元素引用

原因:虽然别的地方删除了,但是对象中还存在对DOM的引用。

解决办法:手动删除,赋值为null

4.被遗忘的定时器或者回调

解决办法:手动删除定时器和DOM,removeEventListener移除事件监听

1、当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。

2、对于纯粹的 ECMAScript 对象而言,只要没有其他对象引用对象 a、b,也就是说它们只是相互之间的引用,那么仍然会被垃圾收集系统识别并处理。但是,在 Internet Explorer 中,如果循环引用中的任何对象是 DOM 节点或者 ActiveX 对象,垃圾收集系统则不会发现它们之间的循环关系与系统中的其他对象是隔离的并释放它们。最终它们将被保留在内存中,直到浏览器关闭。

3、闭包可以维持函数内局部变量,使其得不到释放。

4、

a = {p: {x: 1}}

b = a.pdelete a.p

执行这段代码之后b.x的值依然是1.由于已经删除的属性引用依然存在,因此在JavaScript的某些实现中,可能因为这种不严谨的代码而造成内存泄露。所以在销毁对象的时候,要遍历属性中属性,依次删除。

5、一些DOM操作:IE系列的特有问题 简单的来说就是在向不在DOM树上的DOM元素appendChild;IE7中,貌似为了改善内存泄露,IE7采用了极端的解决方案:离开页面时回收所有DOM树上的元素,其它一概不管。