有没有办法控制 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?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Chrome 开发工具中自动扩展对象?

有没有办法通过远程调试协议或通过命令行启动它从 Edge 浏览器获取任何控制台消息?

Chrome 正在受到自动化软件控制 – 解决办法

有没有办法过滤谷歌浏览器控制台中的输出?

有没有办法在每次控制进入网络选项卡中的脚本时放置一个调试器

chrome 手机端滑动列表的时候控制台会出现很多提示的解决办法