【发布时间】:2014-06-05 18:29:58
【问题描述】:
所以我正在开发这个相当复杂的实时应用程序。我有一个音频引擎,它每 100 毫秒触发一次繁重的音频处理功能,以填充立即播放的缓冲区。 如果这些音频功能运行得太晚,即使运行一次,您也会听到声音卡顿。
大部分时间一切正常。 但是,V8 触发垃圾收集器时,大约需要 150ms 才能完成一轮,从而触发上述裂缝。
那么问题来了:我怎样才能获得更短的垃圾回收?
几点说明:
我们可以尝试分配更少的变量,以便堆增长得更慢,但我想这并不能解决问题:即使触发 GC 的频率降低了一半,我看不出有任何理由运行集合快点。我宁愿让它运行两倍的频率和一半的时间。
我已经阅读了一些关于 V8 的 GC 的内容。我知道我无法直接控制 GC。我知道它有一个短期的过程和一个长期的过程(mark & sweep)。我想是后者导致了这个问题。但是我不知道它花了这么长时间的确切原因:是删除的数据量还是浏览的数据结构?了解这一点可能会有所帮助。
我已经尝试过广泛使用 Chrome 开发工具,并且根据 this article 我需要使用“记录堆分配”模块。但是当我运行一个并并行查看时间线时,我可以看到它一直在触发垃圾收集,就像堆快照一样,所以我无法真正追踪到底是什么让我的内存增长。
我们没有任何内存泄漏,这已经过测试。没有常规的 DOM 访问,也没有创建事件监听器。鉴于具有高 FPS 的应用数量众多,我想这是一个常见问题...请帮助!
编辑
我们想到的另一种解决方案是故意将我们的数据存储在内存泄漏中,以便在我们明确决定释放内存之前 GC 不会运行。这听起来像一个邪恶的黑客,有人做过吗?你怎么看?
【问题讨论】:
-
好吧,我试过了,但没有写出任何不是来自这些网站的副本的东西,只是在这里重写感觉不对,所以我会坚持发布链接gamedev.net/page/resources/_/technical/game-programming/… buildnewgames.com/garbage-collector-friendly-code
标签: javascript garbage-collection real-time google-chrome-devtools v8