asp.net使用Ajax+jquery+定时器,在IE(8--9)中导致内存无限增长,内存泄露

来源:互联网 发布:php base64 编辑:程序博客网 时间:2024/05/16 11:33
在公司的项目中有这样一个功能,使用定时器定时(5秒)执行一个方法,在方法中使用jquery的ajax请求后台返回数据,返回的数据是生成好的Html代码直接将其赋值给页面中的div使用jquery的$("#demoID").html()方式赋值。本来是没有问题的,但是在网页打开一段时间后就会出现内存疯狂的增长,每隔几分钟就增长到了500多兆,并且CPU的占用率也达到了40%-%50几,这时网页就会出现卡死现象。通过查找各类资料发现这是由于内存泄露导致内存一直增长。导出内存泄露的主要代码

function loadData() {            $.ajax({                url: 'post.aspx',                success: function (data) {                    $("#historialPanel").html(data);                    setTimeout("loadData()", 5000);                },                error: function (data) {                    $("#historialPanel").html(errorInfo);                    setTimeout("loadData()", 5000);                }            });        }


通过问题的查找发现可能是由于一下原因造成的。

1、使用jquery的html方法赋值引起的(因该函数不是基于innerHTML实现的

2、可能是js没有进行垃圾回收

3、可能是定时器使用之后没有销毁

第一步加入了ie下可以使用的垃圾回收方法每隔十秒执行一次和每次执行完方法后将定时器销毁,发现效果虽有改善但是还是没解决内存增长的原因。

window.setInterval("CollectGarbage();", 10000);

第二步就将jquery的html赋值方式改为了js的赋值方式

function loadData() {            var setOut;            $.ajax({                url: 'post.aspx',                success: function (data) {                    document.getElementById("historialPanel").innerHTML = data;                    if (setOut != undefined) {                        delete setOut;                    }                    setOut = setTimeout("loadData()", 5000);                },                error: function (data) {                    document.getElementById("historialPanel").innerHTML = errorInfo;                    if (setOut != undefined) {                        delete setOut;                    }                    setOut = setTimeout("loadData()", 5000);                }            });        }

修改之后发现在IE浏览器中浏览时内存增长速度趋于稳定状态,还有一点小幅度的增长但都会自动降下来。

到此问题解决,本想将这个问题重现到自己的网站上,但是发现无论如何都不会出现内存增长的问题,所以我想可能是由于在公司的网站使用的定时器很多和使用了很多的jquery的html方法导致的。到最后在小幅度的增长的内存也可能是这个原因。等有机会在去进一步的排查!


后记:

        在解决这个问题时发现在使用定时器定时执行ajax时如果不注意对象的引用而导致对象一直没有被释放就很有可能出现内存一直增长的问题。所以以后遇到同类的问题第一个排查方向就是查找是不是有使用之后没有释放的对象,如果实在不行就将jquery的方法改为js的原生方法来执行。

最后:

        谢谢RJS的前辈们帮我提出的查找问题的方向,刚开始遇到这个问题感觉从哪里查找都不知道,所以非常感谢!

0 0
原创粉丝点击