浏览器使用AJAX + setInterval继续占用内存

我需要使用JavaScript更新给定时间间隔内的大量数据。 问题是,无论我使用什么JS库(甚至是裸骨js),所有浏览器似乎都在每个AJAX请求上分配内存,并且之后无法释放它。 这是一个应该重现错误的示例:

   Memleak Test    function readData() { $.getJSON('data.php'); } $(document).ready(function() { setInterval(readData, 1000); });    

jsbin提供了一个等效的测试页面

以下是有关此内容的更多信息:

  • 我还尝试在setInterval()调用中直接将readData()函数作为闭包。 这似乎没有任何区别。
  • 我在这里使用jQuery,但任何其他库都会产生相同的错误。
  • 我的data.php脚本只是在PHP中使用json_encode()生成一个伪JSON-Object。
  • 我知道这一秒是一个很短的时间帧,在我的生产脚本中,时间范围是30秒。 我只是想更快地看到效果(在制作应用程序中需要几个小时,但内存也已满)。
  • 这里的问题是该应用程序将全天候开放。

这看起来很简单,我认为我在这里做了一些非常错误的事情,如果这里的一些JS大师可以帮助我的话会很棒!

相同发布的一个可能问题是, 如果XHR请求花费的时间长于轮询周期(平均而言),则待处理请求的队列将会增加 。 如果Web服务器本身开始积压请求,则可能会变成恶性循环。

要避免这种情况,请使用CPS样式编码,使用适当的回调完成下一个操作。 也就是说, 在需要之前不要启动下一个请求 (先前的请求完成:成功或失败) – 如果需要大量未完成的请求,此方法仍可用于创建具有可控大小的手动请求队列。

此外,请确保未使用的对象符合回收条件,因为这是GC语言中“内存泄漏”的“标准”原因。

快乐的编码。


post中的代码不包含任何内在泄漏内存的内容 。 它可能是jQuery内部的一个问题,但这只是猜测。 此外,像Firebug这样监视XHR / Web请求的工具会消耗大量内存,因此需要检查并确保其行为不是Heisenberg。


此外,请记住,增加内存使用量并不表示内存泄漏,除非它无限增长。 垃圾收集周期只会在主机感觉到它时才会发生。

只是一个想法,而不是setInterval你应该使用setTimeout然后当它超时你再次设置超时。

这样,如果由于某种原因丢失了它,就不会冒着setInterval运行的风险:

我还认为jquery ajax有一个成功的回调,你可以用它作为setTimeout的点。 这样,就像其他地方的这个post中提到的那样,你最终不会重叠请求。

(刚检查过并且成功回调)

你每秒钟后都会轮询服务器。 肯定它会占用所有的内存。 但是你可以做的是设置一个预定义的间隔。 然后在轮询之后数据是否可用获取并保持间隔相同,但如果在轮询之后没有可用数据,则增加间隔以确保下一轮询延迟。 这样可以减轻负载。

看看这篇文章 – 可能有所帮助?

如何在IE中强制进行Javascript垃圾回收? 在AJAX调用和DOM操作之后,IE的行为非常慢

(建议使用明显尝试避免内存泄漏的特定JQuery方法:并使用’delete’命令尝试释放空间)。

您将增加内存使用量,因为您在每个请求上加载更多数据。

Clicky:

如何在Ajax请求后释放内存

涉及jQuery Ajax请求的内存泄漏

根据这个jQuery论坛post :

 ... success: function(data) { // the line below prevents the leak, apparently document.getElementById("theContainer").innerHTML = ""; $("#theContainer").html(data); } 

您是否尝试重用调用中的变量? 意味着不是在处理响应的地方创建新变量,而是使用相同的变量。 说

 window.myvar = response["myvar"]; 

它真的是一个漏洞,这可能有助于垃圾收集器。 看到你正在做的事情的实际代码会很高兴。