【问题标题】:Understanding a pattern in Chrome DevTools Memory Performance Graph了解 Chrome DevTools 内存性能图中的模式
【发布时间】:2020-01-21 21:55:54
【问题描述】:

我正在尝试了解如何在使用计时器时防止内存泄漏。我相信 Chrome 开发工具性能选项卡(我仍在学习此功能)内存图向我展示了内存管理方面的不良模式。我相信每次触发 Timer 时都会出现“锯齿”模式。

我有一个简单的test case(1. 右键单击​​“timer-adder.html”,2.单击“预览”以预览加载的 HTML),其中涉及使用构造函数创建对象计时器,换句话说,对于每次更新,DOM 在 setInterval 回调中更改。

//...
start: function (initialTime, prefixedId) {
        let $display = document.getElementById(prefixedId + '-display');
        if ($display.style.display === 'none') { $display.style.display = 'block'; }
        $display.textContent = TimerHandler.cycle(initialTime);
        $display = null;
        return setInterval(function () {
            this.initialTime--;
            (this.initialTime === 0 && this.pause());
            document.getElementById(prefixedId + '-display').textContent = TimerHandler.cycle(this.initialTime);
        }.bind(this), 1000);
},
/...

尝试尽量减少泄漏,但与我认为手头的问题没有直接关系:

  • $display 分配给 null 以使其可收集(垃圾收集)。
  • 清除间隔;

我认为不好的模式: View post on imgur.com(可缩放)

公平的内存使用会转化为显示水平线的 DevTools?对于这种副作用,更安全的方法是什么?因为,正如现在的测试一样,我认为从长远来看,多个活动计时器会导致内存过载,从而导致性能明显下降。

PS:作为一个新人,我希望这是一个公平的问题介绍。谢谢。

【问题讨论】:

    标签: javascript memory scope garbage-collection setinterval


    【解决方案1】:

    从上一部分可以看出,垃圾收集器能够释放该内存。因此没有内存泄漏。

    垃圾回收是一项复杂的任务,这就是为什么 V8 会尽量减少 stop-the-world 回收的数量。或者换句话说:它只在需要时清理内存。 在你的情况下它没有。还有足够的可用空间。

    如果(显着数量的)内存在 GC 调用中持续存在,那么您确实存在内存泄漏。

    $display 分配给 null 以使其可收集(垃圾收集)。

    这只是不必要的。 $display 不会在内部函数中访问,因此在 init 执行后可以进行 gc'ing。重新分配它不会改变这一点。

    【讨论】:

    • 我明白了。我想知道计时器触发时是否有任何问题,因为它显示出增加。它不应该在每次新的计时器触发后收集,不应该在整个过程中保持水平吗?
    • 不,为什么引擎要在 gc'ing 上浪费时间?
    • 我记得在某处读到 GC 是一项没有特定间隔的任务。那正确吗?而且我认为我并没有提炼出让我困惑的东西。也许我应该试着问一下(也许它超出了这篇文章的范围,抱歉)就代码而言,是什么让绿线和蓝线表现得像一个楼梯,向上。你知道吗?
    • 是的,GC 会在需要时运行。而那个“楼梯”的出现会导致你一次分配内存块。
    猜你喜欢
    • 2018-05-24
    • 2021-06-07
    • 2019-10-13
    • 1970-01-01
    • 2019-01-03
    • 2018-05-26
    • 2015-02-23
    • 2011-06-03
    相关资源
    最近更新 更多