2

本番環境でメモリ リークがなければ、ブラウザでチャネルを再度開くことができないようです。チャネルの dev_appserver バージョンはリークしません。

channel.js は iframe を作成するように見え、各チャネルにさらに javascript をロードします。チャネルが再作成されると、古い iframe が DOM から削除され、新しい iframe が作成されたように見えます。

ただし、古い iframe は、window オブジェクトとそれに含まれるすべてのコードと共に、「分離された 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 に答える