2

プロジェクトの 1 つの 2 つのブランチのパフォーマンスを比較していましたが、一方は他方よりもはるかに遅いです。GC 実行回数が 1 つ多いことに気付きました (下のグラフを参照)。

ラン

さらに興味深いことに、実行時間は何倍も長く、追加の実行で説明できるよりもはるかに長くなっています。実行回数が 40% (ish) 増加し、実行時間が 6 倍になった理由は何ですか? より大きなオブジェクト?オブジェクトが多すぎますか? また、ここで調整するノブとその効果は何ですか? (いくつかの良いリンクは答えとして問題ありません)

時間

4

1 に答える 1

2

アプリケーションの2つのブランチ/バージョンのパフォーマンスとGCの動作を分析するためにできることに関するいくつかの基本的なガイドラインを次に示します。

  1. 両方のアプリケーション のGC動作を評価します。
    • GCログを収集し、ライブデータセットのサイズ、割り当て率プロモーション率、および合計GC時間を計算します。これにより、2つのアプリのGCの動作を経験的に比較できるようになります。
    • これらのGC統計をアプリ間で比較する必要があります。2つのアプリケーション間にスパイク/違いが見られますか。
    • これらのデータを収集する方法については、こちらを参照してください:GCの問題に関するクックブックガイドはありますか?
  2. クラスヒストグラムを収集する
    • 手順1で、GCに大きな違いがあることを確認する場合は、クラスヒストグラムを収集して、ヒープを占めるクラスを確認してください。2つのアプリのヒストグラムを比較し、クラスタイプ、インスタンス数に違いがあるかどうかを確認します。これは、原因を特定するのに役立ちます。
    • FullGCの前後のヒストグラムを収集する: -XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC
    • jmap -histo $pidまた、実行中はいつでもスナップショットを収集します。特に、疑わしいResponseTimes/CPUスパイクなどが見られる場合。
  3. Javaプロファイリングツールを使用してメモリをプロファイリングする
    • 2つのアプリケーションのプロファイルを収集して比較し、
    • jProfilerをお勧めします。

パフォーマンス比較の基本的なガイドライン:パフォーマンスを効果的に比較するには、アプリケーションの両方のバージョンで同じワークロードを生成し、ウォームアップ時間で実行してから、安定したフェーズでデータを収集できる必要があります。

于 2013-03-09T00:56:16.800 に答える