chrome 控制台保留了多少日志消息?

问题描述

最近我试图调试导致 Chrome 选项卡因内存不足错误而崩溃的内存泄漏,我认为可能的原因是在控制台中连续记录大对象。

基本上我的代码类似于:

websocket1.onmessage = (m) => {console.log(JSON.parse(m.data)); ...}

当数据很小时,无限期地保持标签页打开是没有问题的。但是,如果数据量很大,选项卡要么没有响应,要么完全耗尽内存。

我创建了以下代码来测试我的理论:

<html>
    <head>
        <script>

var iteration = 0;
function start() {
    var obj1 = new Array(1500).fill(0).map((x,i) => i + iteration);
    iteration++;
    if (document.getElementById("hi").value === "") {
        console.log(iteration,obj1);
    }
    window.setTimeout(start,10);
}

        </script>
    </head>
    <body onload="start()">
        <input id="hi"/>
    </body>
</html>

我在 Chrome v91 中观察到以下行为:

  1. 记录到控制台的对象只要可见就不会被垃圾收集(回想起来这是显而易见的,否则你将无法看到它们)。

  2. 如果控制台被清除,则对象被垃圾回收。

  3. 如果开发者控制台关闭,那么当开发者控制台重新打开时(通过在输入中输入一个值停止记录后),控制台中最多有 1000 条消息。在此之后,旧的消息会被自动垃圾回收。

  4. 如果打开了开发者控制台,则控制台中的消息数量没有限制(至少在内存不足之前)。

这个问题主要是作为一个公共服务公告,但有人可以确认我的观察是 chrome 中的实际行为吗?此外,查看对象是否因为在控制台中可见而被保持打开的最简单方法是什么?我无法解释 chrome 内存分析器的结果,基本上是猜测工作让我相信泄漏可能是由于 console.log

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)