【问题标题】:Why does this javascript refresh leak memory?为什么这个javascript刷新泄漏内存?
【发布时间】:2015-07-18 11:16:47
【问题描述】:

我的电视上有一个仪表板,页面需要每秒刷新一次。

在页面底部我有:

function startRefresh() {
    $.get('', function(data) {
        var newDoc = document.open("text/html", "replace");
        newDoc.write(data);
        newDoc.close();
    });
}
$(function() {
    setTimeout(startRefresh,1000);
});

这很好用,只是每次页面加载都会导致内存使用率上升,正如chrome://memory-redirect/ 所报告的那样。

有没有办法解决这个问题?我没有兴趣为 DIV 创建单独的页面并重新加载该部分。

仅供参考的 http 标头刷新和 document.location = document.location 都产生了不可用的闪烁

【问题讨论】:

  • 可能是一个错误。你在其他浏览器上试过了吗?
  • 我试过你的示例,startRefresh 函数只运行一次
  • 我的猜测是事件调度程序会堆积处理程序,而不会将窗口对象与文档重置一起转储。在任何情况下,我都会避免文档写入并使用 iframe。 iframe 将为您提供真正的重新加载。它会有相同的闪烁到白色的问题,但是因为您在 iframe 中,所以您可以利用 css 并使用 css-tricks.com/prevent-white-flash-iframe 解决它您还可以在屏幕外排队 iframe,以便在您的 TV 应用中进行更有趣的过渡。

标签: javascript jquery html memory-leaks


【解决方案1】:

你试过location.reload()吗?

function startRefresh() {
    location.reload();
}
$(function() {
    setTimeout(startRefresh,1000);
});

编辑:重新阅读问题后,我意识到您不是在要求替代方法,而是对内存泄漏的解释(我没有)。

【讨论】:

  • 不存在这个问题的解决方案也很好......但是这个也有白色闪烁的问题。
【解决方案2】:

如果您使用的是 Chrome,您应该使用“时间轴”来记录内存使用情况。启动时间线,然后等待页面刷新几次,然后停止时间线并查看结果。如果您看到这条线不断增加,这意味着您在内存中的对象(或 DOM 节点)永远不会被释放并被垃圾回收。

我自己从未使用过document.open/write,所以我不知道这是否会导致垃圾收集问题,但我怀疑确实如此。

如果您使用时间轴清楚地检测到内存不足,则打开“配置文件”选项卡并在页面重新加载之前和之后拍摄 Heat 快照,然后使用“比较”查看发生了什么变化以及您的内存影响有多大是。例如,如果您的旧编译代码(或对象引用)仍然存在,再加上新的,那么它解释了您的泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2015-08-04
    • 2016-08-03
    • 2012-05-02
    • 2012-02-20
    相关资源
    最近更新 更多