在生产中没有内存泄漏的情况下,我似乎无法在浏览器中重新打开频道。通道的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代码中(或随后下载的代码中)。
有没有人能够解决这个问题?我正在尝试构建一个可以打开几周的页面,这种泄漏肯定会在一段时间后崩溃平板电脑浏览器。
答案 0 :(得分:0)
这是GAE Channel API Javascript中的一个错误。 显然它已经修复了,但我还没有验证它。
https://code.google.com/p/googleappengine/issues/detail?id=9283