`
crazier9527
  • 浏览: 1013892 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IE,firefox内存溢出原因与解决方法

阅读更多

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


原因

1)循环引用导致了内存泄漏
<html>
<body>
<script type="text/javascript">
document.write("circular references between JavaScript and DOM!");
var obj;
window.onload = function(){
    obj=document.getElementById("DivElement");
document.getElementById("DivElement").expandoProperty=obj;
    obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX"));
};
</script>
<div id="DivElement">Div Element</div>
</body>
</html>


2)由外部函数调用引起的内存泄漏
<html>
<head>
<script type="text/javascript">
document.write(" object s between JavaScript and DOM!");
function myFunction(element)
{
    this.elementReference = element;
    // This code forms a circular reference here
    //by DOM-->JS-->DOM
    element.expandoProperty = this;
}
function Leak() {
    //This code will leak
    new myFunction(document.getElementById("myDiv"));
}
</script>
</head>
<body onload="Leak()">
<div id="myDiv"></div>
</body>
</html>


3)闭包引起的内存泄漏
function parentFunction(paramA){
    var a = paramA;
    function childFunction(){
        return a + 2;
    }
    return childFunction();
}


4)由事件处理引起的内存泄漏模式
<html>
<body>
<script type="text/javascript">
document.write("Program to illustrate memory leak via closure");
window.onload=function outerFunction(){
    var obj = document.getElementById("element");
    obj.onclick=function innerFunction(){
    alert("Hi! I will leak");
    };
    obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX"));
    // This is used to make the leak significant
};
</script>
<button id="element">Click Me</button>
</body>
</html>


解决方法
1)打破循环引用
<html>
<body>
<script type="text/javascript">
document.write("Avoiding memory leak via closure by breaking the circular reference");
    window.onload=function outerFunction(){
    var obj = document.getElementById("element");
    obj.onclick=function innerFunction()
    {
        alert("Hi! I have avoided the leak");
        // Some logic here
    };
    obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX"));
    obj = null; //This breaks the circular reference
    };
</script>
<button id="element">"Click Here"</button>
</body>
</html>


2)添加另一个闭包
<html>
<body>
<script type="text/javascript">
document.write("Avoiding a memory leak by adding another closure");
window.onload=function outerFunction(){
    var anotherObj = function innerFunction(){
        // Some logic here
        alert("Hi! I have avoided the leak");
    };
    (function anotherInnerFunction(){
        var obj =  document.getElementById("element");
        obj.onclick=anotherObj
    })();
};
</script>
<button id="element">"Click Here"</button>
</body>
</html>


3)避免闭包自身

<html>
<head>
<script type="text/javascript">
document.write("Avoid leaks by avoiding closures!");
window.onload=function(){
    var obj = document.getElementById("element");
    obj.onclick = doesNotLeak;
}
function doesNotLeak(){
    //Your Logic here
    alert("Hi! I have avoided the leak");
}
</script>
</head>
<body>
<button id="element">"Click Here"</button>
</body>
</html>


4)考虑用CollectGarbage()
jcl.MemFree = function(Mem){
    Mem = null;
    CollectGarbage();
};


检测软件
sIEve: 他是基于ie的内存泄露检测工具,需要下载运行,http://home.wanadoo.nl/jsrosman/

Leak Monitor: 他是基于firefox的内存泄露检测工具,https://addons.mozilla.org/firefox/2490/

个人建议
内存回收机制本身有问题,所以开发人员开发的时候尽量减少内存溢出。不要盲目的追求完美!

分享到:
评论
1 楼 ylssww 2009-09-17  
我用各种内存检测软件比如 drip, js memory leaks detector, slEve,都查不出 IE 的内存泄露了,但用windows的 perfmon 工具检测 IE 进程仍然发现内存呈线性增长。即使只是对页面做几百次重复简单的刷新操作也会如此。
苦恼啊,不知道还会有什么原因。

richardroky@gmail.com

相关推荐

    IE8 内存泄露(内存一直增长 )的原因及解决办法

    最近开发的时候对页面使用了定时的局部更新,结果在ie6,7和Firefox下,一切正常,而在ie8下过上几个小时就浏览器就崩溃了,显示是内存溢出,我以为是代码写的不好导致内存泄露,但是ie6,7又正常,调查了一下,原来...

    Win7打开IE提示“堆栈满溢”的多种解决方案.docx

    如果使用的是其他浏览器,如Chrome、Firefox等,也可以找到相应的清理缓存功能进行清理。 方案二:注册IE组件 某些情况下,IE的组件可能损坏或未正确注册,导致问题出现。通过命令行重新注册这些组件可以修复问题。...

    IE8以上不能安装如意报表插件方法.pdf

    - 如果如意报表插件不能在IE8以上版本正常工作,可以寻找其他兼容的浏览器或解决方案,例如Chrome、Firefox等现代浏览器,它们通常有更好的插件支持。 - 使用Web服务或基于云的报表工具,这些工具不需要本地插件就能...

    js预览图片兼容所有浏览器

    例如,避免用户上传过大的图片导致内存溢出,可以通过限制文件大小或调整图片质量来解决。同时,确保对用户上传的文件进行安全检查,防止恶意文件的上传。 在实际项目中,可以将这些代码封装成一个函数或组件,以便...

    javascript string字符串优化问题

    4. 内存溢出问题:在测试中,当字符串数量增加到5,000,000时,Firefox抛出了内存溢出的异常。而在IE浏览器中,运行测试会直接显示内存不足的警告。这表明在JavaScript中处理大量数据时,必须考虑到浏览器的内存限制...

    asp.net 实现大文件上传

    7. **兼容性好**:与ASP.NET 3.5完美集成,同时兼容多种浏览器,包括IE、Firefox、Chrome等。 **实现步骤:** 1. **安装NeatUpload**:首先,从官方网站或通过NuGet获取NeatUpload库,并将其添加到项目中。 2. **...

    web项目支持大文件上传的代码2

    为了满足这个需求,开发者需要考虑如何在JSP项目中实现对大文件的高效、稳定上传,并且要兼容不同的浏览器,包括IE6+、Firefox、Chrome和Edge。本项目提供了一种解决方案,它基于特定的文件上传组件和数据库环境——...

    xmljava系统源码-cs_singlewindow_cms:统一门户CMS系统

    -XX:MaxPermSize=512M,否则可能出现这种类型的内存溢出:java.lang.OutOfMemoryError: PermGen space。 Servlet3.0或更高版本(如Tomcat7或更高版本)。 MySQL5.5或更高版本(如需使用MySQL5.0,可将mysql驱动版本...

    asp+ajax做的无刷新文件上传带进度条

    本项目利用ASP(Active Server Pages)服务器端脚本与Ajax结合,实现了最大支持10GB大文件的无刷新上传,同时兼容Internet Explorer(IE)和Firefox等主流浏览器。 1. **ASP基础**: ASP是微软开发的一种服务器端...

    jspsmartupload.rar

    这个组件具有高度的可定制性和灵活性,支持多文件上传,兼容各种浏览器,包括IE、Firefox、Chrome等,且能处理大文件上传,避免了传统方式中可能出现的内存溢出问题。 首先,我们来看一下JSPSmartUpload的上传流程...

    ntko 大文件上传控件的文档

    6. **跨浏览器支持**:ntko大文件上传控件兼容多种主流浏览器,包括IE、Firefox、Chrome、Safari等,确保在不同平台上的兼容性。 7. **API接口和事件驱动**:控件提供丰富的API接口和事件,开发者可以通过编程来...

    UI自动化开发指南

    - **解决方法**: 对 Firefox 进行特殊配置以支持 HTTPS 连接。 **5.2 浏览器设置(IE & FF)** - **说明**: 针对不同浏览器的特定设置,以确保测试过程顺利进行。 **5.3 Y 盘映射** - **目的**: 映射 UI 自动化...

    jspxcms:java 新闻发布系统

    Jspxcms 本源码包采用maven结构,和普通eclipse的web项目结构不一样,且不包含lib目录下的第三方jar包。 环境要求 JDK7或更高版本(支持JDK8...系统后台兼容的浏览器:IE9+、Edge、Firefox、Chrome。 前台页面兼容的浏

    extjs 3.4 开发前准备

    对于EXTJS 3.4和4.1版本的共存问题,可以将它们分别打包成WAR文件,部署到Tomcat或JBoss服务器中,以避免内存溢出。访问EXTJS的API和示例,可以通过配置服务器的URL来实现。 3. EXTJS 开发环境配置 - 浏览器:推荐...

    jspsmartupload

    这个组件解决了在网页中进行大文件上传时常见的问题,如内存溢出、文件类型限制、上传进度显示等,提供了丰富的功能和良好的性能。 在传统的HTTP请求中,表单数据被限制为文本内容,无法直接上传文件。JSPras ...

    Activex在线网页截图

    由于ActiveX主要在IE中使用,对其他浏览器(如Chrome、Firefox)的支持有限。此外,现代操作系统和浏览器出于安全考虑,默认禁用了ActiveX。因此,你可能需要提供替代方案,如使用HTML5的Canvas或WebAssembly来实现...

    淘宝百度校招前端工程师面试题目

    - **概念理解**:Firebug 是 Firefox 浏览器的一款强大调试工具。 - **实践应用**:掌握 Firebug 的使用技巧可以大大提高调试效率。 **4. Linux常用命令** - **概念理解**:Linux 是一种广泛使用的操作系统,了解...

    FCK使用文档

    1. **兼容性测试**:确保FCKeditor在主流浏览器(如IE、Firefox、Chrome、Safari)下正常工作。 2. **性能优化**:合理设置上传文件大小限制,避免内存溢出,减少不必要的资源加载。 3. **错误处理**:监听编辑器的...

    java使用uploadify插件实现多文件上传完整demo

    Uploadify 支持多种浏览器,包括IE6+、Firefox、Chrome、Safari 和 Opera。 2. **多文件上传** Uploadify 允许用户选择多个文件进行批量上传,这是通过HTML5的`multiple`属性实现的。在HTML中,只需在`...

    奥瑞文网络培训系统(免费版2.2.7)

    兼容IE6、IE7、IE8、IE9、360、FireFox、Chrome、Opera等所有浏览器。 产品应用: 奥瑞文oTraining网络培训系统是培训领域的终端平台,HR最信赖工具应用,教育、金融、政府、医疗等企事业单位提供整体化解决方案的...

Global site tag (gtag.js) - Google Analytics