有没有办法控制 Chrome GC?
Posted
技术标签:
【中文标题】有没有办法控制 Chrome GC?【英文标题】:Is there a way to control Chrome GC? 【发布时间】:2014-04-26 05:27:46 【问题描述】:我正在处理大量数据。 机制: javascript 正在读取 WebSQL 数据库,然后将数据组装成具有树结构的 Object。 然后应用于树对象 knockout.js(使元素可观察),然后是数据绑定 然后在最后应用 Jquery Mobile UI。
整个过程花费的时间令人无法接受。 我已经优化了从数据中生成树对象的算法, 还通过将项目直接推送到 ko.observable 数组并仅调用一次 hasMutated 来优化转换为 observables 机制。 我正在应用 knockout.js IF 绑定,以便在打开父级之前不处理 UI 中的不可见树节点。
性能是关键。 在 Chrome 开发人员工具中检查时间轴中的页面加载后,我注意到垃圾收集器在我构建树对象时对每个并发调用进行清理。
问题:有没有办法暂时禁用 Chrome GC,然后在我完成页面处理后再次启用它?
PS 我知道我可以添加对被收集部分的引用,基本上是引入控制和阻止 GC 收集的对象,但这需要通过代码进行大量更改,我不确定我是否可以保持足够长的时间,并且很可能会引入内存泄漏。肯定有更好的办法
【问题讨论】:
您确认性能问题出在 javascript 上,而不是 DOM 上吗?你可以注释掉//ko.applyBindgs(viewmodel);
,它会跳过所有的DOM变化,你可以测试纯javascript的性能。
你不能禁用GC,因为它的执行是在javascript上独立管理的,你只能通过开发者工具强制执行它
重复***.com/questions/13950394/…
@BrettGreen 不,这与那个问题相反,它谈论强制 GC,而这个问题想要禁用 GC。
【参考方案1】:
不,没有办法禁用垃圾收集器。不可能,因为当请求更多内存但没有可用内存时,Chrome 应该做什么?
(此外,垃圾收集器非常细粒度和复杂;您的屏幕截图有点太小而无法阅读,但您所看到的很可能是为了跟上分配的增量工作的小步骤,并且/ 或“次要 GC”循环,仅在发生新分配的堆的相对较小区域上运行。)
如果您想减少花费在 GC 上的时间,那么实现这一目标的主要方法是分配更少和/或更小的对象。是的,这可能意味着更改您的应用程序的设计,以便对象可以被重用,而不是短暂的,或类似的策略更改。
如果你分配很多,你会看到很多 GC 活动,这是没有办法的。即使在不被视为“垃圾收集”的语言/运行时也是如此,例如在 C/C++ 中使用 new
/delete
很多也有性能成本。
【讨论】:
以上是关于有没有办法控制 Chrome GC?的主要内容,如果未能解决你的问题,请参考以下文章