有没有一种方法可以控制Chrome的垃圾回收?

5
我正在处理非常大量的数据。
机制:
JavaScript正在读取WebSQL数据库,然后将数据组合成具有树结构的对象。
然后应用于树形对象knockout.js(使元素可观察),然后数据绑定,最后在其上应用Jquery Mobile UI。
整个过程需要不可接受的时间。
我已经优化了将数据转换为观察机制中的树形对象的算法, 还通过将项目直接推入ko.observable数组并仅调用一次hasMutated来优化转换到可观察机制的机制。 我将knockout.js IF绑定应用于UI中的不可见树节点以避免处理父级打开之前的节点。
性能至关重要。
在Chrome开发人员工具的时间轴中检查页面加载后,我注意到垃圾回收器在构建树形对象时对每个并发调用进行清理。
问题:是否有一种方法可以暂时禁用Chrome GC,然后在完成页面处理后再启用它?
附言:我知道我可以添加对被收集的部分的引用,基本上介绍支配对象并防止GC收集,但这将需要代码中的实质性更改,而且我不确定我能够保持足够长的时间,而且很可能会引入内存泄漏。肯定有更好的方法。

1
你确认性能问题是在JavaScript上,而不是DOM上吗?你可以注释掉//ko.applyBindgs(viewmodel);,这将跳过所有DOM更改,然后你就可以测试纯JavaScript性能了。 - user1375096
你无法禁用GC,因为它的执行在JavaScript上是独立管理的,你只能通过开发者工具强制执行它。 - Martin Surynek
强制在Google Chrome中进行垃圾回收的方法 - Brett Green
@BrettGreen 不是,这个问题与那个问题相反,那个问题是关于强制GC,而这个问题想要禁用GC。 - jmrk
1个回答

1

不,无法禁用垃圾回收器。这是不可能的,因为当请求更多内存但没有可用内存时,Chrome应该怎么做呢?

(此外,垃圾回收器非常细粒度和复杂;您的屏幕截图有点太小了,无法阅读,但很可能您看到的是增量工作的小步骤和/或仅在新分配发生的堆的相对较小区域上运行的“次要GC”周期。)

如果您想减少在GC中花费的时间,则主要方法是分配更少和/或更小的对象。是的,这可能意味着更改应用程序的设计,使对象被重用而不是短暂存在,或类似的策略变化。

如果您分配了很多,您将看到很多GC活动,这是无法避免的。即使在不被认为是“垃圾收集”的语言/运行时中,例如在C/C++中频繁使用new/delete也会有性能成本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接