听说 JavaScript 是一种垃圾收集式语言,也就是说,内存是根据对象的创建分配给该对象的,并会在没有对该对象的引用时由浏览器收回。JavaScript 的垃圾收集机制本身并没有问题,但浏览器在为 DOM 对象分配和恢复内存的方式上却有些出入。IE 和 Firefox 均使用引用计数来为 DOM 对象处理内存。在引用计数系统,每个所引用的对象都会保留一个计数,以获悉有多少对象正在引用它。如果计数为零,该对象就会被销毁,其占用的内存也会返回 给堆。虽然这种解决方案总的来说还算有效,但在循环引用方面却存在一些盲点。
原因
1、循环引用导致了内存泄漏
- HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码
2、由外部函数调用引起的内存泄漏
- HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码
3)、闭包引起的内存泄漏
function parentFunction(paramA){ var a = paramA; function childFunction(){ return a + 2; } return childFunction(); }
4、由事件处理引起的内存泄漏模式
- HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码
解决方法
1、打破循环引用
- HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码
2、添加另一个闭包
- HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码
3、避免闭包自身
- HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码
4、考虑用CollectGarbage()
jcl.MemFree = function(Mem){ Mem = null; CollectGarbage(); };
下面附上实用的IE,Firefox内存溢出检测软件
sIEve: 他是基于 IE 的内存泄露检测工具,需要下载运行,下载地址:http://home.wanadoo.nl/jsrosman/
Leak Monitor: 他是基于 Firefox 的内存泄露检测工具,下载地址:https://addons.mozilla.org/firefox/2490/ 或者直接在浏览器的 工具/附加组件 里搜索 Leak Monitor
- 引自 吉光片羽的使用心得
- sIEve 是英文界面,不太会用,而且遇到大的内存溢出,会直接崩溃关闭 - -b
Leak Monitor 是繁体版,会提示具体溢出的节点,但是目前还没看明白怎么利用……