空requestAnimationFrame循环泄漏内存?

Gie*_*usT 7 javascript memory performance memory-leaks requestanimationframe

我有一个带有requestAnimationFrame循环的干净HTML文件,完全没有处理.但是,如果我查看Chrome DevTools上的内存消耗,我会看到使用的内存不断增加,垃圾收集器每隔几秒运行一次,以收集大约1兆字节的垃圾数据.

那么这个内存泄漏来自哪里?

这就是我的内存使用情况:

Chrome DevTools内存使用数据

这是我的代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <title></title>
    <script>

        function update() {

            window.requestAnimationFrame(update);

        }

        update();

    </script>
</head>
<body>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

gma*_*man 3

我也调查了这个。我来到这里是因为我注意到 Chrome 正在跟踪呼叫的来源。

\n\n

show devtools 显示调用链

\n\n

我注意到它一直回到原来的通话

\n\n

devtools 追溯到原始调用

\n\n

因此,我让它运行一个小时,每隔几分钟检查一次。它确实分配了一段时间的内存,但最终似乎释放了一些。

\n\n

我很确定这样做是为了使调试其他异步代码更容易,因为了解某些异步请求从哪里开始很有帮助。如果没有该路径,您得到的只是事件/回调被调用,而不是创建它的位置。

\n\n

这就是说我理解你的痛苦。众所周知,24fps 存在问题,电影导演往往会避免出现这些问题的场景类型。当《霍比特人》上映并以 48 fps 拍摄时,导演尝试在 24 fps 失败的情况下添加一些类型的场景。

\n\n

在视频游戏中众所周知,30 fps 对于任何 2D 卷轴游戏来说都不够。对于屏幕游戏来说还算可以(PS1、PS2、N64 上的整代游戏都以 30 fps 的速度发售),但对于 2D 卷轴游戏来说,整个屏幕似乎以 30 fps 的速度快门,而在 60 fps 时则显得流畅

\n\n

无论如何,我没有建议的解决方案。这就是浏览器的工作方式。每次创建事件时,都requestAnimationFrame必须分配一些小对象并将其放入要在将来某个时刻执行的事件列表中,这本身就占用内存。特别requestAnimationFrame是,浏览器可能会出现特殊情况,只有一个预分配的几个事件队列并尝试回收它们,而不是使用它们用于所有其他事件(鼠标、键盘、图像加载、XHR 请求完成等)的通用系统但这可能很难实现,因为当事件实际执行时,它们可能需要位于同一个队列中。

\n\n

即便如此,JavaScript 本身就是关于分配内存的。不这样做几乎是不可能的。调用函数会分配参数,因为它们最终成为该函数的闭包上下文的一部分(JS 引擎可能会优化它,但从语言的角度来看它们是分配的)。

\n\n

现在浏览器开始瞄准需要 90fps 的 WebVR,也许他们会想出一种新方法。或者也许我们都会转向 WebAssembly?

\n\n

\xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf

\n