gpt4 book ai didi

javascript - 我的 JS 实时应用程序中的垃圾收集时间太长

转载 作者:数据小太阳 更新时间:2023-10-29 04:46:10 26 4
gpt4 key购买 nike

所以我正在开发这个相当复杂的实时应用程序。我有一个音频引擎,每 100 毫秒触发一次大量的音频处理功能,以填充立即播放的缓冲区。 如果这些音频功能运行得有点晚,即使运行一次,您也会听到声音断断续续

大部分时间一切正常。 然而,当垃圾收集器被V8触发时,大约需要150ms才能完成一轮,从而触发上述裂缝

所以问题来了:我怎样才能缩短垃圾回收时间?

几点说明:

我们可以尝试分配更少的变量,让堆增长得更慢,但我想这不会解决问题:即使 GC 触发频率减半,我也看不出有任何理由让收集运行快点。我宁愿让它运行的频率加倍,持续时间减半。

我读过一些关于 V8 GC 的文章。我知道我无法直接控制 GC。我知道它有一个短期过程和一个长期过程(标记和清除)。我想这是导致问题的后一个。但是我不知道它花了这么长时间的确切原因:是删除的数据量还是浏览的数据结构?了解这一点可能会有所帮助。

我已经尝试广泛使用 Chrome 开发工具,并且根据 this article我需要使用“记录堆分配”模块。但是当我运行一个并并行查看时间线时,我可以看到它一直触发垃圾收集,非常像堆快照,所以我无法真正追踪到底是什么让我的内存增长。

我们没有任何内存泄漏,这已经过测试。没有常规的 DOM 访问,也没有创建事件监听器。我想这是一个常见问题,考虑到具有高 FPS 的应用数量...请帮助!

编辑

我们想到的另一种解决方案是故意将我们的数据存储在内存泄漏中,以便在我们明确决定释放内存之前 GC 不会运行。这听起来像是一个邪恶的黑客,有没有人这样做过?你怎么看?

最佳答案

您可以尝试实现“对象池”设计模式。基本原则是重用变量而不是创建并删除它们。最好按对象类型设置一个池。

这是一个非常基本的实现。

var pool = [];
var poolRelease = function(obj) {
pool.push(obj);
};
var poolGet = function() {
// You could add parameters to the function to directly set the values of the object.
if (pool.length) {
return pool.pop();
}
// We don't have preexisting object, create it (can be anything).
return {x: 0, y: 0};
}

// Then in the code:
var myObj = poolGet();
myObj.x = 20;
// When finished with the object move it back to the pool to avoid garbage collection.
poolRelease(myObj);

关于javascript - 我的 JS 实时应用程序中的垃圾收集时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24067606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com