Можете ли вы повторно открыть каналы GAE в браузере без утечки памяти?

Кажется, я не могу повторно открывать каналы в своем браузере без утечки памяти на производстве. Версия канала dev_appserver не протекает.

Channel.js, по-видимому, создает iframe, который затем загружает дополнительный javascript для каждого канала. Когда канал воссоздается, похоже, что старый iframe удаляется из DOM и создается новый iframe.

Тем не менее, старый iframe по-прежнему висит как «Отдельное дерево DOM» вместе с объектом окна и всем содержащимся в нем кодом, что в сумме составляет около 1 МБ на канал.

Я попытался создать урезанный пример, демонстрирующий такое поведение. «/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 (или в последующем загруженном коде).

Кто-нибудь смог обойти это? Я пытаюсь создать страницу, которая может быть открыта в течение нескольких недель, и эта утечка определенно приводит к сбою браузеров планшетов через некоторое время.


person dragonx    schedule 07.05.2013    source источник
comment
Есть ли прогресс/обходные пути @dragonx?   -  person rGil    schedule 08.08.2013
comment
Можно ли удалить скрытый старый iframe?   -  person rGil    schedule 08.08.2013
comment
Я так не думаю, по крайней мере, не из стороннего кода. Его убрали из дома, так что вы никак не сможете к нему добраться. Это какой-то код javascript, который содержит переменную, и у вас нет доступа к этому коду. В любом случае, это должно быть исправлено сейчас.   -  person dragonx    schedule 08.08.2013


Ответы (1)


Это была ошибка в Javascript GAE Channel API. Вроде исправили, но я еще не проверял.

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

person dragonx    schedule 08.08.2013