有没有办法控制Chrome GC?

时间:2014-03-19 18:22:05

标签: javascript google-chrome knockout.js garbage-collection v8

我正在处理大量数据 机制:
JavaScript正在读取WebSQL数据库,然后将数据组装到具有树结构的Object中 然后应用于树对象knockout.js(使元素可观察)然后数据绑定 然后在最后应用Jquery Mobile UI。

整个过程需要不可接受的时间 我已经优化了使树对象脱离数据的算法, 还通过将项直接推送到ko.observable数组并仅调用hasMutated一次来优化转换为observables机制。 我正在应用knockout.js IF绑定来处理UI中不可见的树节点,直到打开父节点。

这里的表现很关键 在Chrome开发人员工具中检查时间轴中的页面加载后,我注意到在构建树对象时,垃圾收集器正在清理每个并发调用。

Chrome timeline - we can see GC collecting items multiple times

问题:有没有办法暂时禁用Chrome GC,然后在完成页面处理后再次启用它?

PS我知道我可以添加对收集的部分的引用,基本上引入支配GC的对象并阻止GC收集,但这需要通过代码进行大量更改,而且我不确定我能保持足够长的时间,并且它很可能会引入内存泄漏。当然必须有更好的方法

1 个答案:

答案 0 :(得分:0)

不,没有办法禁用垃圾收集器。不可能,因为当请求更多内存但没有可用时Chrome应该做什么?

(此外,垃圾收集器非常精细且复杂;您的屏幕截图有点太小而无法读取,但您很可能看到的是增量工作的小步骤以跟上分配,并且/或“次要GC”循环仅在堆的相对较小的区域上运行,其中新的分配发生。)

如果您想减少在GC中花费的时间,那么如何实现这一目标的主要方法是分配更少和/或更小的对象。是的,这可能意味着更改应用程序的设计,以便重用对象而不是短暂的,或类似的策略更改。

如果你分配很多,你会看到很多GC活动,没有办法解决这个问题。即使在不被视为“垃圾收集”的语言/运行时中也是如此,例如,在使用new / delete的C / C ++中,很多也会产生性能成本。