浏览器使用 AJAX + setInterval 不断消耗内存

2024-02-21

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

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <title>Memleak Test</title>
            <meta charset="utf-8" />
            <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
            <script type="text/javascript">

                function readData() {
                    $.getJSON('data.php');
                }

                $(document).ready(function() {
                    setInterval(readData, 1000);
                });
            </script>
        </head>
        <body>
            <div id="content"></div>
        </body>
    </html>

等效的测试页位于jsbin http://jsbin.com/ixeve5/3

以下是更多相关信息:

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

这看起来很简单,我觉得我在这里做的事情真的是错误的,如果这里的一些 JS 专家能帮助我,那就太好了!


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

这样,如果您由于某种原因失去了对 setInterval 的跟踪,您就不会面临 setInterval 消失的风险:

  • http://weblogs.asp.net/bleroy/archive/2009/05/14/setinterval-is-moderately-evil.aspx http://weblogs.asp.net/bleroy/archive/2009/05/14/setinterval-is-moderately-evil.aspx

我还认为 jquery ajax 有一个成功回调,您可以将其用作设置超时的点。这样,正如本线程其他地方提到的那样,您就不会出现重叠的请求。

  • http://api.jquery.com/jQuery.getJSON/ http://api.jquery.com/jQuery.getJSON/

(刚刚检查了一下,有成功回调)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浏览器使用 AJAX + setInterval 不断消耗内存 的相关文章

随机推荐