`
yinwufeng
  • 浏览: 287010 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

浏览器内存泄漏问题的跟踪与解决

阅读更多
浏览器内存泄漏问题的跟踪与解决 收藏
在Ajax盛行以前,浏览器内存泄漏不是什么大问题,因为都是通过页面跳转和刷新来进行与服务端的交互,而现在情况不一样了,很多应用广泛应用Ajax和iframe,结果内存泄漏成了很多富客户端应用的隐患。比如我现在参与的项目长期以来一直深受内存泄漏问题的困扰,测试人员常常抱怨,因为他们是使用软件最多的人员,常常几个小时后的点击就让浏览器占用的内存达到几百M,有时甚至到G,但我们开发人员始终没有很好解决这个问题,归结其原因,主要是开发人员没有关注内存泄漏的意识,开发时只管功能实现,不管是否造成了内存泄漏,但问题积攒到一定级别时,解决问题的成本就不小了。同时,检测内存泄漏的工具和手段确实有限,仅有的两个工具(JavaScript Memory Leak Detector和 sIEve )都不太好用,不像Java里面的一些工具能精准定位。另外,项目里大量使用了Ext和Jquery框架,这些框架本身就存在内存泄漏的问题,因此,需要常常深入到这些框架的源码,这自然提高了解决问题的难度。

这块骨头难啃,但必须啃下不可,因为造成的影响实在太恶劣,此项目将为服务与千万级别的客户,如果让这千万级别的客户都去忍受动辄占用几百M的应用,实在说不过去。有关内存泄漏的文章很多,比如《Understanding and Solving Internet Explorer Leak Patterns》 是最权威一篇,里面提到了几个造成内存泄漏的模式,摘抄如下:

1.Circular References—When mutual references are counted between Internet Explorer's COM infrastructure and any scripting engine, objects can leak memory. This is the broadest pattern.

2.Closures—Closures are a specific form of circular reference that pose the largest pattern to existing Web application architectures. Closures are easy to spot because they rely on a specific language keyword and can be searched for generically.

3.Cross-Page Leaks—Cross-page leaks are often very small leaks of internal book-keeping objects as you move from site to site. We'll examine the DOM Insertion Order issue, along with a workaround that shows how small changes to your code can prevent the creation of these book-keeping objects.

4.Pseudo-Leaks—These aren't really leaks, but can be extremely annoying if you don't understand where your memory is going. We'll examine the script element rewriting and how it appears to leak quite a bit of memory, when it is really performing as required.

但如果通过这么几个模式去check项目里的代码简直如大海捞针,我只有凭经验预测最有可能泄漏的几个点,再通过排除法,去掉先相关代码,再看内存是否泄漏。我预计会有以下几种情况造成泄漏:

1.频繁操作iframe
2.动态创建DOM
3.事件绑定
4.Ext框架本身
经过排查发现项目这么几个点内存泄漏较为严重:

1.对iframe里面的页面大量绑定键盘事件
2.在iframe里面的页面动态创建DOM
3.iframe的刷新
4.Ext本身
对于这些问题我的解决方案如下:

1.离开iframe里的页面之前删除所有的事件绑定,删除所有动态创建的DOM
2.刷新iframe内容之前调用
iframe.contentWindow.document.write('');
iframe.contentWindow.document.close();
强制释放iframe里的页面元素
3.修改Ext某些点。
比如Ext.getDOC()
        getDoc : function(){
            //原实现
            //return Ext.get(document);
            //修改后
            var f = function() {
                };
            f.prototype = Ext.Element.prototype;
            var docEl = new f();
            docEl.dom = document;
            return docEl;
        }
具体是什么原因还没查清,不过修改后确实内存释放了不少。
4.修改Ext垃圾回收相关代码。及时删除垃圾回收的轮询。
修改以上点后,内存基本保持在100多M,相比以前改进了不少,但并没完全消除内存泄漏,因此此问题的跟踪还得继续,力争将内存泄漏减为0


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cutesource/archive/2009/09/13/4549105.aspx
分享到:
评论

相关推荐

    IE内存泄露分析工具:sIEve/Drip

    标题中的“IE内存泄露分析工具:sIEve/Drip”指的是两个专门用于检测和分析Internet Explorer浏览器内存泄漏问题的工具。sIEve和Drip是独立的工具,但它们都致力于帮助开发者定位和解决IE浏览器中的内存管理问题。 ...

    sIEve IE内存泄露监控

    `sIEve IE内存泄露监控` 是一款专注于检测和分析Internet Explorer(简称IE)浏览器内存泄漏问题的工具。它作为一个绿色软件,无需安装即可直接运行,为用户提供了一种方便的方式来检测网页在IE浏览器中可能导致性能...

    测试内存泄露测试软件

    4. **修复与验证**:修改代码以解决内存泄露问题,并重新运行测试以确认问题是否已解决。 5. **性能监控**:持续监控程序的内存使用情况,确保修复后的程序在长时间运行下内存使用保持稳定。 对于Web开发,除了...

    extjs 2.2 内存泄漏补丁

    - **智能DOM引用管理**:通过跟踪和适时断开JavaScript对象与DOM元素的连接,避免内存泄漏。 - **优化闭包**:重新设计函数结构,减少不必要的外部变量引用,或者在不再需要时显式解除引用。 在应用这个补丁之后,...

    01-JS内存泄漏.md

    本节将详细探讨JS内存泄漏的原因、检测方法以及如何预防和解决内存泄漏问题。 ### 为何要考察内存泄漏 在大厂前端面试中,内存泄漏问题的考察通常是为了测试候选人对于JavaScript底层原理的掌握程度。由于内存泄漏...

    sIEve-0.0.8(IE Sieve_检测IE内存泄露情况)

    sIEve-0.0.8是一款专为解决IE内存泄露问题而设计的工具,它的主要目标是帮助开发者和用户检测并定位IE的内存泄露情况。 内存泄露通常发生在程序错误地分配和释放内存时。对于像IE这样的浏览器,它会加载各种网页和...

    V8堆快照的内存自动泄漏检测

    V8堆快照的内存自动泄漏检测是JavaScript开发中的一项重要技术,主要目的是发现和解决JavaScript应用程序中的内存泄漏问题。内存泄漏会导致程序占用过多的内存,影响性能甚至导致程序崩溃。Eclipse Memory Analyzer...

    CE内存查看器

    "CE内存查看器"是一款专为解决计算机内存管理问题而设计的强大工具,尤其在处理内存泄漏这类棘手问题时表现出色。它允许用户深入到操作系统内部,实时监控和分析内存的使用情况,从而帮助开发者诊断并修复可能导致...

    ext内存泄露的两个补兵

    通过重写源码以增强内存管理,以及利用内存分析工具定位问题,可以有效地解决EXT内存泄露,提升应用的性能和稳定性。在实践中,结合良好的编程习惯和内存管理策略,将有助于构建高效且健壮的EXT应用。

    Drip-0.5,用于查看DOM元素和内存泄漏监控

    Drip-0.5是一款专为开发者设计的工具,特别适用于Internet Explorer浏览器插件,它提供了强大的功能,帮助开发者深入理解和诊断DOM(文档对象模型)元素以及浏览器的内存泄漏问题。在网页应用开发过程中,DOM元素...

    解决因浏览器关闭导致购物车数据丢失问题

    当`items`从会话中恢复后,需要从缓存中移除对应的会话,防止内存泄漏。 第二种方法(注释部分)则是将一个`BuyCart`对象(可能是封装了购物车数据的类)存储在会话中,并设置名为"JSESSIONID"的Cookie,这通常是...

    IE 内存检测工具

    IE(Internet Explorer)作为曾经广泛使用的浏览器,其性能问题,特别是内存泄漏,经常受到开发者关注。"IE 内存检测工具"是专门针对这类问题设计的实用工具,帮助开发者定位和解决IE浏览器中的内存消耗问题。 内存...

    用C++Builder做的浏览器

    此外,优化网络请求、减少内存泄漏和提高渲染速度都是提升浏览器性能的关键。 开发一款浏览器是一个系统工程,需要理解网络协议、HTML渲染、用户交互等多个领域的知识。C++Builder作为开发工具,虽然不自带完整的...

    进程浏览器

    而**进程浏览器**则提供了一套全面的解决方案,帮助用户深入了解系统的运行状态。 ### 1. 进程快照 **进程快照**是进程浏览器的核心特性之一。它允许用户在任意时间点捕获当前系统中所有运行进程的状态信息,包括...

    小树浏览器(IE浏览器)源代码

    10. **调试和测试**:了解如何在源码层面设置断点、跟踪内存泄漏以及进行自动化测试,这对于任何软件开发都至关重要。 通过深入研究小树浏览器的源码,开发者不仅能学习到浏览器的基本构建模块,还能掌握到VC++编程...

    蚂蚁浏览器

    此外,还有智能广告拦截功能,有效屏蔽恶意广告和跟踪脚本,保护用户免受网络欺诈和隐私泄露的风险。同时,蚂蚁浏览器还提供了安全浏览模式,可以在匿名状态下浏览网页,避免个人信息被记录。 除了基础功能,蚂蚁...

    VC简易浏览器

    浏览器需要有效地分配和释放内存,防止内存泄漏,确保程序的稳定运行。 7. **多线程**:为了提供流畅的用户体验,浏览器通常会使用多线程。例如,一个线程负责网络通信,另一个线程则更新用户界面,这样即使在加载...

    C#浏览器

    - 注意内存管理和资源释放,避免不必要的内存泄漏。 - 考虑使用异步加载策略,提高用户体验。 10. **调试与测试**: - 使用Visual Studio的调试工具进行代码调试,检查可能出现的问题。 - 对不同浏览器内核、...

    WMI 资源浏览器(汉化版)

    - **故障诊断**:当系统出现故障时,WMI可以帮助定位问题,比如通过查询内存使用情况找出内存泄漏的问题。 - **性能优化**:通过监控CPU、内存、硬盘等资源的使用情况,可以调整系统设置或应用程序以提升性能。 - **...

    C#个人浏览器源代码

    【C#个人浏览器源代码】是一个基于C#编程语言实现的个人化网络浏览器项目,它旨在提供一个定制化的浏览体验,同时解决常见的技术问题,如Session管理、JavaScript交互以及窗口关闭处理。在这个项目中,开发者可能...

Global site tag (gtag.js) - Google Analytics