【问题标题】:JQuery JSONP polling memory leaksJQuery JSONP 轮询内存泄漏
【发布时间】:2012-11-07 07:19:15
【问题描述】:

我需要在高度动态的 Web 应用程序中执行 jsonp 长轮询,但是我遇到了大量内存泄漏。最初,我使用了 Socket.IO 和 jsonp 传输,结果相同,然后设置了一个 JQuery 测试页面,以查看问题是否仅在 socket.io 库中本地化。 我惊讶地发现,从 JQuery 进行 jsonp 轮询也会导致相同的结果:在 IE9 中,内存增长非常快(不到 10 分钟),从大约 80-90 MB 增加到超过 1.8 GB :(。

他是客户端的测试代码:

<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">        
    <script type="text/javascript">
        $(document).ready( function() {
            var doPoll = function() {
                $.ajax({
                    type: 'GET',
                    url: "http://<server-url>/jquery-jsonp/server.php",
                    cache: false,
                    async: true,
                    crossDomain: true,
                    dataType: "jsonp",
                    success: function (data, status) {
                        console.log("Received response"+data);
                        doPoll();
                    },
                    error: function (xhr, textStatus, errorThrown) {
                        // access denied
                    }
                });
            }

            doPoll();     
        });
    </script>
</head>

这是虚拟服务器响应:

<?php echo $_GET['callback']."(".json_encode(array("status"=>"success")).")";

正如您所见,这里没有什么特别之处。关于导致此问题的原因和可能的解决方法有什么想法吗?

请求需要跨域执行,必须支持IE8/9。 非常感谢。

【问题讨论】:

  • 你有解决这个问题的办法吗?它也发生在我身上......这里的问题是,我们正在将Phonegap用于移动应用程序,即使我更改页面也会出现问题......:-X

标签: jquery memory-leaks jsonp


【解决方案1】:

尝试每隔几秒调用doPoll(),如下所示:

success: function (data, status) {
    console.log("Received response"+data);
    setTimeout(doPoll, 10000); // 10 second wait before next request sent
},

【讨论】:

    【解决方案2】:

    您无需在收到回复的那一刻进行投票。与常规计算机操作相比,HTTP 传输可能很慢,但它们通常仍比人类反应快一点。至少延迟几秒钟是个好主意。

    也就是说,应该注意的是,HTTP 轮询充其量是相当不可靠的。以 HTML facebook 聊天作为其不可靠程度的指标。

    编辑:

    各位,感谢您的回复。延迟下一个请求不是 此应用的选项

    那么您不应该为此使用网页。改为编写桌面或移动应用程序。如果您的回答是“这也不是一个选择”。那么不存在可行的选择。 HTTP/HTML/Javascript 只是不是旨在“每秒向用户提供高度动态的关键业务更新”,我怀疑它永远不会。

    【讨论】:

    • 各位,感谢您的回复。不幸的是,延迟下一个请求不是这个应用程序的选项,因为它是高度动态的,并且所有更新每秒都尽快交付到 UI 是至关重要的(每一秒都会发生很多不同的事情服务器端和 UI 需要被通知所有这些)。所以我需要每秒至少执行 5 -10 个请求,这就是为什么我最初想使用 Socket.IO,但即使在这个库中内存问题仍然存在。
    • 我也尝试过使用常规 XHR 轮询而不是 JSONP 来查看会发生什么(只是删除了 dataType:"jsonp" 设置并将其替换为 dataType:"json"。其余的代码是不变)并且内存增加,但速度比使用 jsonp 慢得多(在 ~1h 内它从 40MB 增长到 300MB )。我会检查它是否会在某个时候停止并更新评论。尽管如此,我仍然不明白为什么 JSONP 会占用如此多的内存,以及为什么即使是 XHR 轮询技术也会继续增加 IE9 上的内存使用量。我希望不时清理内存。
    • 您可以尝试使用WebSockets,它保持与服务器的连接打开,服务器可以在需要时将数据推送给用户,而不是用户不断ping更新。但是来吧,你连250毫秒都不能延迟??什么样的商业(非游戏)应用甚至不能等待 250 毫秒
    【解决方案3】:

    所有建议都是有效的,即使您需要每半秒轮询一次服务器,您也应该添加几毫秒的超时时间,让 javascript 暂停一下,以便它可以开始清除内存。

    另一个问题是 JSONP,因为它会在 DOM 中创建带有响应的新标签。您应该开始删除未使用的节点,否则您的页面大小将无限增长并最终耗尽内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多