本番環境でメモリ リークがなければ、ブラウザでチャネルを再度開くことができないようです。チャネルの 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 コード (またはその後にダウンロードされたコード) にあることを示唆しています。
誰かがこれを回避できましたか? 数週間開いているページを作成しようとしていますが、このリークにより、しばらくするとタブレット ブラウザーが確実にクラッシュします。