如果生产时没有内存泄漏,我似乎无法在浏览器中重新打开频道。频道的 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 代码(或随后下载的代码)中。
有没有人能够解决这个问题?我正在尝试构建一个可以打开数周的页面,而这种泄漏肯定会在一段时间后使平板电脑浏览器崩溃。