Кажется, я не могу повторно открывать каналы в своем браузере без утечки памяти на производстве. Версия канала 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 (или в последующем загруженном коде).
Кто-нибудь смог обойти это? Я пытаюсь создать страницу, которая может быть открыта в течение нескольких недель, и эта утечка определенно приводит к сбою браузеров планшетов через некоторое время.