2

如果生产时没有内存泄漏,我似乎无法在浏览器中重新打开频道。频道的 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 代码(或随后下载的代码)中。

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

4

1 回答 1

0

这是 GAE Channel API Javascript 中的一个错误。显然它现在已修复,但我尚未验证它。

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

于 2013-08-08T03:00:22.230 回答