返回列表

转载: IE,Firefox内存溢出?4种可能的原因及解决方法!另附检测工具!

默认分类 2011-11-22 23:35:09

转载: http://www.jgpy.cn/blog/front-end/4_reasons_and_solutions_to_ie_firefox_javascript_memory_leak.htm

听说 JavaScript 是一种垃圾收集式语言,也就是说,内存是根据对象的创建分配给该对象的,并会在没有对该对象的引用时由浏览器收回。JavaScript 的垃圾收集机制本身并没有问题,但浏览器在为 DOM 对象分配和恢复内存的方式上却有些出入。IE 和 Firefox 均使用引用计数来为 DOM 对象处理内存。在引用计数系统,每个所引用的对象都会保留一个计数,以获悉有多少对象正在引用它。如果计数为零,该对象就会被销毁,其占用的内存也会返回 给堆。虽然这种解决方案总的来说还算有效,但在循环引用方面却存在一些盲点。

原因

1、循环引用导致了内存泄漏
HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码

2、由外部函数调用引起的内存泄漏
HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码

3)、闭包引起的内存泄漏

  1. function parentFunction(paramA){

  2. var a = paramA;

  3. function childFunction(){

  4. return a + 2;

  5. }

  6. return childFunction();

  7. }


4、由事件处理引起的内存泄漏模式
HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码

解决方法

1、打破循环引用
HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码

2、添加另一个闭包
HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码

3、避免闭包自身
HTML :\ Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行 运行此代码

4、考虑用CollectGarbage()

  1. jcl.MemFree = function(Mem){

  2. Mem = null;

  3. CollectGarbage();

  4. };


下面附上实用的IE,Firefox内存溢出检测软件
sIEve: 他是基于 IE 的内存泄露检测工具,需要下载运行,下载地址:http://home.wanadoo.nl/jsrosman/
Leak Monitor: 他是基于 Firefox 的内存泄露检测工具,下载地址:https://addons.mozilla.org/firefox/2490/ 或者直接在浏览器的 工具/附加组件 里搜索 Leak Monitor

引自 吉光片羽的使用心得
sIEve 是英文界面,不太会用,而且遇到大的内存溢出,会直接崩溃关闭 - -b
Leak Monitor 是繁体版,会提示具体溢出的节点,但是目前还没看明白怎么利用……
平均得分8.00分(共1次打分)