web-dev-qa-db-ja.com

Googleでガベージコレクションを強制するChrome

[〜#〜] zk [〜#〜] を使用して、サーバーと常に通信し、画面の一部を更新する単一ページのWebアプリを開発しています。更新は1秒と同じ頻度で行われます。これらの更新中に、大量の[〜#〜] js [〜#〜]オブジェクトへの参照が失われ、これらのオブジェクトは最終的にガベージコレクターによってクリーンアップされる必要があります。

わかっている限り、Chromeは非アクティブなタブでのみガベージコレクターを実行します。アプリのタブは通常アクティブで、ほとんど更新されないため、これは問題です[〜#〜] js [〜#〜]オブジェクトが収集されることはありません。十分な時間アクティブのままにすると、タブは最終的にクラッシュします(Aww Snapメッセージ)。

ガベージコレクションを手動で開始する必要があります。これまで、Chromeで_--js-flags="--expose-gc"_を実行し、gc()を実行しようとしましたが、例外がスローされます。

_ReferenceError: gc is not defined
_

これはFirefoxでは発生しません。メモリ使用量はほぼ一定です。

ページを強制的に更新することはオプションではありません。

ありとあらゆる提案に感謝します。

[〜#〜] edit [〜#〜]window.gc()およびgc()を実行してみましたChromeバージョン_23.0.1271.97 m_および_25.0.1364.2 dev-m_の両方

43
Paulius K.

Chrome Dev Toolsのコードをフェッチし、ProfilerAgent.collectGarbage();が時々呼び出されるように修正することができます。タイムラインパネルで)、_--debug-devtools-frontend_フラグを使用して、お使いのバージョンのDevToolsでChromeを実行します。

ただし、この解決策は非常に極端です。本当に必死になったときにのみ試してください。それまでは、アプリケーションのプロファイルを作成し、v8がガベージを削除しない(またはガベージを削除できない)理由を確認することを提案します。 DevToolsのタイムラインパネルがこれを支援します。このパネルの下部にある[ガベージコレクション]ボタンが本当に機能するかどうかを確認することから始めます。そうでない場合は、メモリリークが発生している可能性があります(少なくともv8によると)。その場合は、 leak-Finder-for-javascript を試してください。

[[〜#〜] edit [〜#〜]] chrome拡張機能についての情報を削除しました。 _--js-flags="--expose-gc"_を使用すると、gc()をWebページコードから呼び出すことができます(少なくとも23.0.1271.64では)。

38
Konrad Dzwinel

Chrome開発ツールには、「タイムライン」セクションがあります。Chrome 53.ごみ箱のようなボタンがあります。クリックすると、強制的に実行するガベージコレクター enter image description here

更新:

Chromeの最新バージョンでは、GCボタンが[パフォーマンス]タブに移動しました。 enter image description here

25
Nisim Joseph

私は解決策を見つけました。どうやらChromeは少なくとも現在のバージョン(現在26.0.1410.65)でDOMノードをリークしています

開発ツールのタイムラインをアプリに記録すると、イベントリスナーのカウントがアプリ画面のコンテンツとともにリズミカルに増減することが示されましたが、DOM Nodeカウントは時間とともに着実に増加していました。クラッシュしました。

最新のChrome= Canary(28.0.1500.3)を試してみたところ、問題は修正されたようです。DOMNodeカウントグラフは、イベントリスナー。

私を得るのは...なぜGmailがクラッシュしないのですか?私は通常、一度に数週間タブを開いたままにします...

4
Partap Davis