Ajax沉重的JS应用程序随着时间的推移使用过多的内存

时间:2011-01-14 21:52:47

标签: javascript ajax json memory-leaks

我正在处理的应用程序中似乎有一些非常大的内存泄漏。该应用程序本身并不复杂。每15秒,页面从服务器请求大约40kb的JSON,并使用它在页面上绘制一个表。绘制表格更便宜,因为数据通常总是新的。我在表中附上了一些事件,每行大约5个,表格中有30行。我使用jQuery的.html()方法将新的html放入容器中并覆盖现有的。我特意这样做,以便jQuery的特殊清理函数进入并尝试分离它被覆盖的元素中的元素上的所有事件。然后,我使用delete my_var将它们发送到DOM后删除大的html变量。

我检查了循环引用和附加事件,这些事件从未被清除过几次,但从未真正挖到它。我想知道是否有人可以给我一些关于如何优化像这样的非常重的应用程序的指针。我刚刚选择了Nicholas Zakas的“高性能Javascript”,但还没有太多时间进入它。

为了了解它使用了多少内存,在4小时后,它在chrome上使用了大约420,000k,在Firefox或IE上使用了更多。

谢谢!

7 个答案:

答案 0 :(得分:1)

我经历过同样的事情。我有一段代码每10秒轮询一次并检索当前用户错误(数据输入/审计)的计数,这是一个简单的整数。然后用它来替换div中的文本(这样用户就知道他们的工作中发现了新的错误)。如果放置过夜,浏览器最终会使用超过1GB的内存!

我最接近解决问题的方法是每2分钟减少一次轮询,并坚持让用户在一天结束时关闭。一个更好的解决方案仍然是使用Ajax Push Engine仅在创建错误时将数据推送到页面。这将导致数据发送频率降低,从而减少使用的内存。

答案 1 :(得分:1)

你是否将任何东西保存到abject / array?我之前已经发生过这样的事情,使用了一个镀铬插件,其中一个阵列不断变得越来越大。听起来这可能是你的问题,特别是考虑到你拿到40k。

答案 2 :(得分:1)

一个片段会很棒似乎你每次都在创建新的变量,而旧的变量不会超出范围,因此不会被垃圾收集。

还尝试使用构造函数和对象实例封装更多JS。当JS只是一个函数列表而且所有变量都具有全局范围而不是实例的属性时,JS可能会占用大量内存。

答案 3 :(得分:1)

为什么不绘制表并仅附加事件一次,只需每15秒更换一次表数据?

答案 4 :(得分:1)

1)Jquery Ajax包装器,反复调用,导致内存泄漏,社区意识到这一点(尽管ajax包装器上的问题并不像你的情况那么难看。)

2)在优化方面,你已经完成了第一步(使用轻量级json调用)和delete方法,但问题出在“事件附加”区域和html方法中。

我的意思是: 1)你可能在每次html()调用后重新连接监听器 2)你在每个ajax调用上重新绘制孔表。 这确实会导致内存泄漏。

你必须: 1)在服务器端绘制表(第一次内容) 2)$(document).ready你已经将监听器附加到表的单元格中 3)用ajax调用json服务,解析响应 4)用解析的数组数据重新填充表

告诉我们你同时遇到了什么:)

答案 5 :(得分:1)

我建议在没有事件的情况下编写脚本的测试版本。 DOM / JS循环引用可能很难发现。通过从等式中消除一些变量,您可以稍微缩小搜索范围。

答案 6 :(得分:0)

本周我遇到了类似的问题。事实证明我的数据库中有一个循环引用。我的广告资源项ABC123已被标记为被XYZ321替换,我还XYZ321被标记为由ABC123复制。有时循环引用不在PHP代码中。