【发布时间】:2013-05-01 17:45:52
【问题描述】:
如果没有生产中的内存泄漏,我似乎无法在浏览器中重新打开频道。频道的 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 代码(或随后下载的代码)中。
有没有人能够解决这个问题?我正在尝试构建一个可以打开数周的页面,而这次泄漏肯定会在一段时间后使平板电脑浏览器崩溃。
【问题讨论】:
-
有任何进展/解决方法@dragonx?
-
可以delete隐藏的旧iframe吗?
-
我不这么认为,至少不是来自第三方代码。它已从 dom 中删除,因此您无法获得它。它是一些 javascript 代码,其中包含一个变量,您无权访问该代码。反正现在应该修好了。
标签: google-app-engine channel-api