空的requestAnimationFrame循环泄漏内存?

时间:2015-10-15 08:57:46

标签: javascript performance memory memory-leaks requestanimationframe

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

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

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

Chrome DevTools memory usage data

这是我的代码:

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

        function update() {

            window.requestAnimationFrame(update);

        }

        update();

    </script>
</head>
<body>

</body>
</html>

1 个答案:

答案 0 :(得分:0)

我也对此进行了调查。我来到这里是因为我注意到Chrome正在跟踪来电的来源。

show devtools showing call chain

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

devtools traced back to original call

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

我很确定这样做可以更容易地调试其他异步代码,因为知道某些异步请求的启动位置很有帮助。如果没有这条路径,你得到的就是你的事件/回调被调用,而不是它被创建的地方。

那说我理解你的痛苦。众所周知,24fps存在问题,电影导演倾向于避免出现那些显示这些问题的场景。当"The Hobbit"出现并以48fps拍摄时,导演试图以24fps的速度添加一些类型的场景。

在电子游戏中众所周知,30fps对于任何2D滚动游戏来说还不够。对于进入屏幕游戏而言,它是可以通行的(PS1,PS2,N64上的整代游戏以30fps的速度出货)但是对于2D滚动游戏,整个屏幕似乎以30fps的速度快门,因为它在60fps时显得平滑

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

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

现在浏览器开始针对需要90fps的WebVR,他们可能会想出一种新的方法。或许我们都会切换到WebAssembly?

¯\ _(ツ)_ /¯