你能否在浏览器中重新打开GAE频道而不泄漏内存?

时间:2013-05-07 17:05:10

标签: google-app-engine channel-api

在生产中没有内存泄漏的情况下,我似乎无法在浏览器中重新打开频道。通道的dev_appserver版本不会泄漏。

channel.js似乎会创建一个iframe,然后为每个频道加载更多javascript。重新创建频道时,看起来旧的iframe已从DOM中删除,并且会创建新的iframe。

但是,旧的iframe仍然作为“分离的DOM树”以及窗口对象及其包含的所有代码而挂起,每个通道总共增加大约1MB。

我试图构建一个简化的示例来演示此行为。 “/ newtokenapi”只是服务器上的一个处理程序,它创建一个新的通道并返回一个json编码的标记。

<html>
<head>
    Dine-O Test Page
</head>
<body>
    <h1>Test</h1>
    <script type="text/javascript" src="/_ah/channel/jsapi"></script>
    <script>
        var token, channel, socket, oReq;

        function onOpen(e) {
            console.log("socket opened!");
        }

        function onError(e) {
            console.log("socket error!");
        }

        function onClose(e) {
            console.log("socket closed!");

            newChannel();
        }

        function newChannel() {
            oReq = new XMLHttpRequest();
            oReq.open("GET", "/newtokenapi", true);
            oReq.onload = function (e) {
                token = JSON.parse(oReq.response)["token"];
                channel = new goog.appengine.Channel(token);
                socket = channel.open();
                socket.onopen = onOpen;
                socket.onerror = onError;
                socket.onclose = onClose;
            }
            oReq.send();
        }

        newChannel();

        setInterval(function () {
            console.log("forcing socket close");
            socket.close();
        }, 30000);
    </script>
</body>
</html>

我认为我的代码中没有看到内存泄漏(你能找到吗?),这表明它存在于channel.js代码中(或随后下载的代码中)。

有没有人能够解决这个问题?我正在尝试构建一个可以打开几周的页面,这种泄漏肯定会在一段时间后崩溃平板电脑浏览器。

1 个答案:

答案 0 :(得分:0)

这是GAE Channel API Javascript中的一个错误。 显然它已经修复了,但我还没有验证它。

https://code.google.com/p/googleappengine/issues/detail?id=9283