浏览器内存不断增加javascript ajax调用

时间:2010-03-09 18:45:03

标签: javascript jquery memory memory-leaks

我有一种奇怪的行为。我正在使用一个相当繁重的页面(4000个节点),用于显示交付操作的调度系统。每30秒。我正在刷新jquery,操作列表(超过4000的3000个节点)。它运行得非常好,但是......每次,firefox和chrome的内存都会增加3到6ko。当然,过了一会儿,浏览器崩溃......

有人有什么想法吗?这是内存泄漏吗? javascript无法到达某个地方吗?我检查过,每次刷新后我都有相同数量的节点,这意味着更换工作正常。

每次刷新操作后,我重置了几个事件:这是一个例子

$("#orders_list .list_table_row").hover(
            function(){
            //  mouse over
                $(this).children().css("background-color","#E0E0E0");   
            },
            function(){
            //  mouse out
                $(this).children().css("background-color","");  
            });

任何建议都非常受欢迎,提示,任何事情......

我发现了两个有趣的链接: http://www.javascriptkit.com/javatutors/closuresleak/index3.shtmlhttp://www.jibbering.com/faq/faq_notes/closures.html

谢谢, 保罗

修订版1 - 添加了代码示例和链接

2 个答案:

答案 0 :(得分:4)

您的问题可能是事件处理程序。每次刷新时管理所有这些节点的绑定和解除绑定可能过于复杂。

尝试使用事件委派。 jQuery的.live()方法就是你想要的。它将使刷新更快并消除事件处理程序的复杂性和泄漏。

而不是$(".myclass").click(/*...*/)使用$(".myclass").live("click", /*...*/)。您只需在页面加载时执行一次,即使在ajax刷新后,它也可以用于该类的所有未来元素。

请参阅文档:http://api.jquery.com/live/

答案 1 :(得分:2)

在删除那些事件绑定的节点之前,您必须解除绑定(并最好是销毁)事件处理程序。如果不这样做会泄漏记忆 IE在使用闭包时也存在泄漏内存的问题,如果闭包在某些时候是孤立的并且没有被正确销毁,在某些情况下垃圾收集器将无法拾取它。 有一些工具可用于跟踪内存泄漏(上面的注释中提到了Firefox一个),IE Leak DetectorJavaScript Memory Leak Detector
有关浏览器中内存泄漏的更多信息(主要是IE):
Understanding and Solving Internet Explorer Leak Patterns
Closures Leaks in IE