关于javascript:在Google Chrome中强制垃圾回收

您所在的位置:网站首页 谷歌浏览器怎么清理垃圾 关于javascript:在Google Chrome中强制垃圾回收

关于javascript:在Google Chrome中强制垃圾回收

2024-07-09 12:12| 来源: 网络整理| 查看: 265

我们正在开发使用ZK的单页Web应用程序,该应用程序会不断与服务器通信并更新其部分屏幕。更新频率可能高达1s。在这些更新期间,将丢失对大量JS对象的引用,并且最终必须由垃圾收集器清理这些对象。

据我们了解,Chrome仅在非活动标签上运行其垃圾收集器。这对我们来说是一个问题,因为该应用程序的选项卡通常处于活动状态,并且几乎从不刷新,因此JS对象永远不会被收集。如果保留足够长的时间处于活动状态,则该选项卡最终会崩溃(Aww Snap消息)。

我们需要手动启动垃圾收集。到目前为止,我们已经尝试使用--js-flags="--expose-gc"和gc()运行Chrome,但是会引发异常:

1ReferenceError: gc is not defined

在Firefox上不会发生这种情况,内存使用或多或少是一个常数。

强制刷新页面不是一种选择。

我们将感谢您提出的所有建议。

编辑:我们尝试在Chrome版本23.0.1271.97 m和25.0.1364.2 dev-m上同时运行window.gc()和gc()

相关讨论 "据我们了解,Chrome仅在非活动标签上运行其垃圾收集器。"否,那是不对的。无论标签是否处于活动状态,Chrome都会在需要时运行GC。 您是否尝试使用JavaScript delete? 它的window.gc()并不是最终的解决方案,因为AFAIK它仅适用于Chrome的调试版本。正如Crowder指出的那样,Chrome会在需要时运行它,因此,如果您的应用程序泄漏内存,那么您应该查看代码以尽可能明确地释放分配的对象。 @Cerbrus:delete与JavaScript中的内存管理无关,只是如果您碰巧使用它来删除属性(这是对对象的唯一引用)纯粹是副作用。 @ T.J。Crowder:是的,我知道delete不一定会触发gc,但是它可以帮助手动清理对象。也许我应该详细说明一下。 @Cerbrus::-)只是避免神话继续存在(哇,Brendan应该把它叫做remove之类的东西,但是嘿,他正承受着巨大的时间压力……)。 @ T.J.Crowder:我们在code.google.com上发现了一个问题,用户还声称,除非将Tab键设为非活动状态,否则GC不会发生(第7条评论)。它解析为WontFix。它很可能应该按照您的描述工作,但是由于某种原因没有。 @guilty:我不以那种方式解释该线程,而是将其解释为有人说他们认为应该尽快释放内存,而有人说他们认为会导致Aw崩溃!但为此提供了零支持数据。显然,如果您可以通过反复拖入图像来使Chrome浏览器崩溃,那不是WontFix的情况。

您可以获取Chrome Dev Tools的代码,对其进行修改,以使其每次都被调用ProfilerAgent.collectGarbage();(当您在"时间轴"面板上单击"收集垃圾"按钮时会调用该代码),然后使用您的DevTools版本运行Chrome使用--debug-devtools-frontend标志。

但是,这种解决方案非常极端,只有在您绝望时才尝试。到那时,我建议对您的应用程序进行性能分析,并检查为什么v8决定不清除垃圾(或无法清除垃圾)。 DevTools的"时间轴"面板将帮助您解决这一问题。首先检查该面板底部的"收集垃圾"按钮是否确实起作用,否则可能会发生内存泄漏(至少根据v8而言)。如果是这样,请尝试针对JavaScript的Leak-finder。

[编辑]我删除了有关chrome扩展的信息,因为事实证明,使用--js-flags="--expose-gc"时可以从网页代码中调用gc()。至少在我的23.0.1271.64上。

相关讨论 事实证明,您必须先关闭所有当前的Chrome进程,然后才能使用--js-flags打开一个进程。 现在gc()似乎可以工作。"收集垃圾"按钮也可以使用。 谢谢,您提供了很多帮助。 有什么办法可以通过JavaScript调用吗?

在Chrome开发人员工具中,您可以在Chrome 53的"时间轴"部分中找到。那里的按钮看起来像垃圾箱。单击它,它迫使垃圾收集器运行。

更新:

在较新版本的Chrome中," GC"按钮已移至"性能"标签。

相关讨论 较新的版本已将"收集垃圾"按钮移至开发人员工具中的"性能"选项卡:i.stack.imgur.com/tguqy.png 嗨,即使不录制表演,它也会强制执行GC吗? 是。 您可以按任意想要的次数。 随时随地 我相信在最新的Chrome浏览器中,此垃圾桶按钮现在已添加到"记录"按钮旁边的"内存"部分中。 在我的系统中,"性能"和"内存"选项卡中似乎都有一个。

我找到了解决方案。显然,Chrome至少在当前版本中泄漏DOM节点(目前为26.0.1410.65)

我在应用程序中记录了开发工具的时间轴,它显示事件监听器的计数随着应用程序屏幕的内容而有节奏地上升和下降,但是随着时间的推移,DOM节点数一直稳定增长,直到选项卡崩溃为止。

我尝试了最新的Chrome Canary(28.0.1500.3),他们似乎已解决了问题。 DOM节点计数图现在遵循与事件侦听器相同的节奏模式。

让我着迷的是...为什么gmail不会崩溃?我通常一次打开标签数周...

相关讨论 好吧,至少他们修复了它。 迟来总比没有好:)感谢您的更新。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3