JQuery JSONP轮询内存泄漏

时间:2012-11-19 11:14:25

标签: jquery memory-leaks jsonp

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

他是客户端的测试代码:

<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。 非常感谢你。

3 个答案:

答案 0 :(得分:1)

尝试以几秒钟的间隔调用doPoll(),如下所示:

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

答案 1 :(得分:0)

您收到回复的那一刻就不需要轮询。与常规计算机操作相比,HTTP传输可能较慢,但它们通常比人类反应快一点。延迟至少几秒钟是一个好主意。

那说应该注意到HTTP轮询充其量是不可靠的。以HTML Facebook聊天为例,说明它的不可靠程度。

修改

  

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

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

答案 2 :(得分:0)

所有建议都是有效的,即使你需要每半秒轮询一次服务器,你应该添加几毫秒的超时时间来给javascript一个小暂停,这样它就可以开始清理内存。

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