3

我需要在高度动态的 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。非常感谢。

4

3 回答 3

1

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

success: function (data, status) {
    console.log("Received response"+data);
    setTimeout(doPoll, 10000); // 10 second wait before next request sent
},
于 2012-11-19T11:16:19.540 回答
0

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

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

编辑:

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

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

于 2012-11-19T11:18:01.103 回答
0

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

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

于 2012-11-19T12:56:55.487 回答