【问题标题】:Can you reopen GAE Channels in the browser without leaking memory?您可以在浏览器中重新打开 GAE 频道而不泄漏内存吗?
【发布时间】:2013-05-01 17:45:52
【问题描述】:

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

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

【问题讨论】:

  • 有任何进展/解决方法@dragonx?
  • 可以delete隐藏的旧iframe吗?
  • 我不这么认为,至少不是来自第三方代码。它已从 dom 中删除,因此您无法获得它。它是一些 javascript 代码,其中包含一个变量,您无权访问该代码。反正现在应该修好了。

标签: google-app-engine channel-api


【解决方案1】:

这是 GAE Channel API Javascript 中的一个错误。 貌似现在已经修复了,但是我还没有验证。

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

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 2013-12-16
    • 2012-01-13
    • 2011-09-22
    • 2016-07-14
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多