15

ガベージ コレクションが大幅に一時停止しています。問題を解決する前に、このコレクションに最も関与しているオブジェクトを特定したいと思います。Chrome のヒープ スナップショットを見てきましたが、(間違っている場合は訂正してください) 何が収集されているかを示す指標が見つからないようで、最も多くのメモリを占有しているものだけが見つかります。これに経験的に答える方法はありますか、それとも私は知識に基づいた推測に限定されていますか?

4

4 に答える 4

9

Chrome プロファイルでは、確認したいアクションを実行する前と実行した後に 1 つずつ、合計 2 つのヒープ スナップショットを取得します。

次に、2 番目のスナップショットをクリックします。

下部のバーには、オプション「概要」を含む選択ボックスが表示されます。「比較」に変更します。

次に、その横の選択ボックスで、比較するスナップショットを選択します (自動的にスナップショット 1 が選択されます)。

結果として、必要なデータを含むテーブルが得られます。「新規」および「削除済み」オブジェクト。

于 2013-08-21T17:49:29.373 に答える
6

Chrome の新しいリリースでは、この種のタスクに便利な新しいツールを利用できます。

「レコード ヒープ割り当て」プロファイリング タイプ。通常の「ヒープ スナップショット」比較ツール (Rafał Łużyński の回答で説明されているように) では、ヒープ スナップショットを作成するたびに GC が実行されるため、そのような情報を提供できません。ただし、「ヒープ割り当ての記録」ツールを使用すると、常にすべての割り当てが記録されます (そのため、記録中にアプリケーションの速度が大幅に低下する可能性があります)。頻繁に GC を実行している場合、このツールはコード内で大量のメモリが割り当てられている場所を特定するのに役立ちます。ヒープ スナップショットの比較と組み合わせると、ほとんどの場合、比較からわかるよりもはるかに多くのメモリが 2 つのスナップショット間に割り当てられていることがわかります。

残念ながら、ツールの現在のバージョンでは、割り当てが行われた場所は表示されませんが、が割り当てられ、割り当て時にどのように保持されたかが表示されます。ただし、データ (および場合によってはコンストラクター) から、オブジェクトを識別できるため、オブジェクトが割り当てられている場所を特定できます。

于 2013-08-27T07:08:25.370 に答える
3

いくつかの可能性のある犯人から選択しようとしている場合は、オブジェクト定義を変更して、グローバルスコープにアタッチすることができます (ドキュメントの下のリストなど)。次に、これにより、それらが収集されなくなります。これにより、プログラムが高速化されたり (再利用されていない)、遅くなったりします (それらが蓄積され、毎回マークアンドスイープによってチェックされるため)。そのため、パフォーマンスに変化が見られる場合は、問題が見つかった可能性があります。

1 つの代替方法は、各タイプで作成されているオブジェクトの数を確認することです (コンストラクターでカウンターを設定します)。それらが大量に収集されている場合は、同様に頻繁に作成されています。

于 2012-09-22T21:31:57.223 に答える