CPU と割り当てプロファイリングの概要
このトピックでは、CPU と割り当てのプロファイリングの基本概念について説明します。 これらの概念は、IntelliJ プロファイラーの動作を理解できます。
IntelliJ プロファイラーの仕組み
CPU および割り当てプロファイリングの場合、IntelliJ IDEA は次のプロファイラーとの統合を提供します。
Java Flight Recorder – JDK の一部として提供される標準のプロファイリングツール。
非同期プロファイラー – ネイティブコールおよびメモリ割り当てデータも収集できる非常に正確なプロファイラー。
デフォルトでは、IntelliJ IDEA は両方のプロファイラーを並行して実行して、最も正確な結果を提供します。 サポートされているプロファイラーを個別に使用することもできますが、ほとんどのシナリオでは、すぐに使用できる組み合わせ構成の方が適しています。 このアプローチでは、両方のプロファイラーの利点を活用し、非常に特殊な要件がない限り、セットアップを一切不要にします。
IntelliJ プロファイラーは、CPU と割り当ての両方のプロファイリングデータを収集します。 これが何を意味するのか、簡単に説明します。
CPU プロファイリング
CPU プロファイリングは、すべての実行中のスレッドのスタックトレースを一定間隔で収集することで動作します。 これを実現するために、IntelliJ プロファイラーは JVM と OS の API の両方を使用し、ネイティブ部分のインサイトを取得し、JVM のみをクエリするプロファイラーが通常失敗するような極端なケースでも正確な JVM プロファイリングを保証します。
IntelliJ IDEA のプロファイラーはサンプリングを使用します。 つまり、インストルメンテーションベースのプロファイラーが行うすべてのメソッドのエントリと終了をキャプチャーする代わりに、IntelliJ プロファイラーは一定の間隔でスタックトレースのみを取得します。

これにより、データのごく一部が犠牲になり、全体像には影響しませんが、プロファイルされたアプリケーションのフットプリントが最小化されるなど、いくつかの重要な利点がもたらされます。 これにより、物事の偏りのないビューが得られ、パフォーマンスにほとんど影響を与えることなく、本番環境でアプリケーションのプロファイルを作成することもできます。
プロファイラーがサンプルを収集する頻度は、サンプルレートと呼ばれます。 プロファイリングシナリオに応じて 設定できます。 サンプルレートが高いほど、スナップショットのサイズは大きくなりますが、より正確なイメージが得られます。 逆に、スナップショットのサイズを管理可能な制限内に抑えることが重要な要素となる、長時間実行されるシナリオでは、サンプルレートを低くすることが望ましい場合があります。
メモリ割り当てプロファイリング
IntelliJ プロファイラーはメモリ割り当てイベントに反応します。 このようなイベントが発生すると、IntelliJ プロファイラーは要求元のスレッドの呼び出しスタックと割り当てられたオブジェクトのタイプを記録します。
この情報は、特定のタイプの割り当てを説明するコードパスと、これらの割り当ての大きさを理解できます。
CPU プロファイリングと同様に、プロファイラーは、意味のあるイメージを形成するのに十分なデータのみを記録することにより、フットプリントを最小限に抑えます。
プロファイリングワークフロー
通常、プロファイリング手順は次の手順で構成されます。
データを収集します。 プロファイラーは、アプリケーションの開始時にアタッチすることも、後でアタッチすることもできます。 プロファイリングを停止すると、IntelliJ IDEA がスナップショットを生成します。
プロファイルを開いて分析します。 このステップでは、組み込みツールを使用して、生データを意味のある形式で整理し、必要に応じてスライスすることができます。 分析へのアプローチは、ゴールによって異なる場合があります。