50

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

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

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

ReferenceError: gc is not defined

これはFirefoxでは発生しません-メモリ使用量は多かれ少なかれ一定です。

ページを強制的に更新することはできません。

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

編集:Chromeバージョンwindow.gc()gc()23.0.1271.97 m25.0.1364.2 dev-m

4

3 に答える 3

45

Chrome Dev ToolsのコードをフェッチProfilerAgent.collectGarbage();し、時々呼び出されるように変更して(タイムラインパネルの[Collect Garbage]ボタンをクリックすると呼び出されるコードです)、--debug-devtools-frontendフラグを使用してDevToolsのバージョンでChromeを実行できます。

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

[編集gc()]使用時にウェブページのコードから呼び出すことができることが判明したため、Chrome拡張機能に関する情報を削除しました--js-flags="--expose-gc"。少なくとも私の23.0.1271.64では。

于 2012-12-19T11:47:04.863 に答える
35

Chromeデベロッパーツールには、Chrome53周辺の「タイムライン」セクションがあります。ボタンはゴミ箱のように見えます。それをクリックすると、ガベージコレクターが強制的に実行されます。 ここに画像の説明を入力してください

アップデート:

Chromeの最新バージョンでは、GCボタンが[パフォーマンス]タブに移動しました。 ここに画像の説明を入力してください

于 2016-10-22T17:05:25.960 に答える
5

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

アプリに開発ツールのタイムラインを記録すると、アプリ画面のコンテンツに合わせてイベントリスナーの数がリズミカルに増減していることがわかりましたが、タブがクラッシュするまで、DOMノードの数は時間の経過とともに着実に増加していました。

最新のChromeCanary(28.0.1500.3)を試しましたが、問題が解決したようです。DOMノードカウントグラフは、イベントリスナーと同じリズミカルなパターンに従うようになりました。

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

于 2013-05-08T01:39:52.637 に答える