オフラインプロファイリング
JProfilerでアプリケーションをプロファイルするには、基本的に2つの異なる方法があります。デフォルトでは、JProfiler GUIをアタッチしてプロファイルします。JProfiler GUIは、記録の開始と停止のためのボタンを提供し、すべての記録されたプロファイリングデータを表示します。
JProfiler GUIを使用せずにプロファイルし、後で結果を分析したい場合があります。このシナリオのために、JProfilerはオフラインプロファイリングを提供します。オフラインプロファイリングでは、プロファイルされたアプリケーションをプロファイリングエージェントで開始し、JProfiler GUIと接続する必要がありません。
しかし、オフラインプロファイリングでもいくつかのアクションを実行する必要があります。少なくとも1つのスナップショットを保存しなければ、後で分析するためのプロファイリングデータは利用できません。また、CPUや割り当てデータを見るためには、ある時点で記録を開始する必要があります。同様に、保存されたスナップショットでヒープウォーカーを使用したい場合は、ヒープダンプをトリガーする必要があります。
プロファイリングAPI
この問題に対する最初の解決策はコントローラーAPIです。APIを使用すると、コード内でプログラム的にすべてのプロファイリングアクションを呼び出すことができます。api/samples/offline
ディレクトリには、コントローラーAPIを実際にどのように使用するかを示す実行可能な例があります。そのディレクトリで../gradlew
を実行してコンパイルおよび実行し、テストプログラムがどのように呼び出されるかを理解するためにGradleビルドファイルbuild.gradle
を学習してください。
コントローラーAPIは、実行時にプロファイリングアクションを管理するための主要なインターフェースです。これは、JProfilerインストール内のbin/agent.jar
に含まれているか、Maven依存関係として以下の座標で利用できます。
group: com.jprofiler artifact: jprofiler-probe-injected version: <JProfiler version>
およびリポジトリ
https://maven.ej-technologies.com/repository
プロファイリングAPIがアプリケーションの通常の実行中に使用される場合、API呼び出しは静かに何も行いません。
このアプローチの欠点は、開発中にJProfilerエージェントライブラリをアプリケーションのクラスパスに追加し、ソースコードにプロファイリング指示を追加し、プログラム的なプロファイリングアクションを変更するたびにコードを再コンパイルする必要があることです。
トリガー
トリガーを使用すると、ソースコードを変更せずにJProfiler GUIでプロファイリングアクションをすべて指定できます。トリガーはJProfiler設定ファイルに保存されます。設定ファイルとセッションIDは、オフラインプロファイリングが有効になっている状態で開始するときにコマンドラインでプロファイリングエージェントに渡され、プロファイリングエージェントはそれらのトリガー定義を読み取ることができます。
プロファイリングAPIとは対照的に、API呼び出しをソースコードに追加するのではなく、トリガーはJVMで特定のイベントが発生したときにアクティブになります。たとえば、特定のプロファイリングアクションのためにメソッドの開始または終了時にAPI呼び出しを追加する代わりに、メソッド呼び出しトリガーを使用できます。別の使用例として、スナップショットを定期的に保存するために独自のタイマースレッドを作成する代わりに、タイマートリガーを使用できます。
各トリガーには、関連するイベントが発生したときに実行されるアクションのリストがあります。これらのアクションの一部は、コントローラーAPIのプロファイリングアクションに対応しています。さらに、メソッド呼び出しをパラメータと戻り値と共に印刷するアクションや、メソッドのインターセプタースクリプトを呼び出すアクションなど、コントローラー機能を超える他のアクションもあります。
オフラインプロファイリングの設定
JProfilerで起動されたセッションを設定している場合、メインメニューからセッション→変換ウィザード→アプリケーションセッションをオフラインに変換を呼び出すことで、オフラインセッションに変換できます。これにより、適切なVMパラメータを持つ開始スクリプトが作成され、JProfiler UIで使用するのと同じセッションからプロファイリング設定が取得されます。呼び出しを別のコンピュータに移動したい場合は、セッション→セッション設定のエクスポートを使用してセッションを設定ファイルにエクスポートし、開始スクリプトのVMパラメータがそのファイルを参照していることを確認する必要があります。
統合ウィザードを使用してアプリケーションサーバーをプロファイルするときは、常に開始スクリプトまたは設定ファイルが変更され、プロファイリングのためのVMパラメータがJava呼び出しに挿入されます。すべての統合ウィザードには、「スタートアップ」ステップで「オフラインプロファイル」オプションがあり、インタラクティブプロファイリングの代わりにオフラインプロファイリングのためにアプリケーションサーバーを設定できます。
統合ウィザードで処理されない開始スクリプトがある場合など、Java呼び出しに自分でVMパラメータを渡したい場合があります。そのVMパラメータの形式は次のとおりです。
-agentpath:<path to jprofilerti library>=offline,id=<ID>[,config=<path>]
これは[Generic application]
ウィザードから利用できます。
ライブラリパラメータとしてoffline
を渡すと、オフラインプロファイリングが有効になります。この場合、JProfiler
GUIとの接続はできません。session
パラメータは、プロファイリング設定に使用する設定ファイルからのセッションを決定します。セッションのIDは、セッション設定ダイアログのアプリケーション設定タブの右上隅に表示されます。オプションのconfig
パラメータは設定ファイルを指します。これは、セッション→セッション設定のエクスポートを呼び出してエクスポートできるファイルです。このパラメータを省略すると、標準の設定ファイルが使用されます。そのファイルは、ユーザーホームディレクトリの.jprofiler15
ディレクトリにあります。
GradleとAntを使用したオフラインプロファイリング
GradleまたはAntからオフラインプロファイリングを開始する場合、対応するJProfilerプラグインを使用して作業を簡単にすることができます。テストをプロファイルするためのGradleタスクの典型的な使用例を以下に示します。
plugins { id 'com.jprofiler' version 'X.Y.Z' id 'java' } jprofiler { installDir = file('/opt/jprofiler') } task run(type: com.jprofiler.gradle.TestProfile) { offline = true configFile = file("path/to/jprofiler_config.xml") sessionId = 1234 }
com.jprofiler.gradle.JavaProfile
タスクは、標準のJavaExec
タスクで実行するのと同じ方法で任意のJavaクラスをプロファイルします。JProfilerで直接サポートされていない他の方法でJVMを起動する場合、com.jprofiler.gradle.SetAgentPathProperty
タスクは必要なVMパラメータをプロパティに書き込むことができます。JProfilerプラグインを適用するとデフォルトで追加されるため、単に次のように書くことができます。
setAgentPathProperty { propertyName = 'agentPathProperty' offline = true configFile = file("path/to/jprofiler_config.xml") sessionId = 1234 }
その後、タスクが実行された後にagentPathProperty
をプロジェクトプロパティ参照として他の場所で使用できます。すべてのGradleタスクと対応するAntタスクの機能は、別の章で詳細に文書化されています。
実行中のJVMに対するオフラインプロファイリングの有効化
コマンドラインユーティリティを使用すると、バージョン8以上の任意の実行中のJVMでオフラインプロファイリングを開始できます。VMパラメータと同様に、 bin/jpenable
offline
スイッチ、セッションID、およびオプションの設定ファイルを指定する必要があります。
jpenable --offline --id=12344 --config=/path/to/jprofiler_config.xml
このような呼び出しでは、実行中のJVMのリストからプロセスを選択する必要があります。追加の引数--pid=<PID> --noinput
を使用すると、プロセスを自動化し、ユーザー入力をまったく必要としないようにすることができます。
一方、オンザフライでオフラインプロファイリングを有効にする場合、いくつかの記録を手動で開始したり、スナップショットを保存したりする必要があるかもしれません。これは、コマンドラインツールで可能です。
bin/jpcontroller
プロファイリングエージェントがロードされているだけで、プロファイリング設定が適用されていない場合、記録アクションをオンにすることはできず、は接続できません。これは、 jpcontroller
を使用してプロファイリングを有効にした場合でも、 jpenable
offline
パラメータを指定しない場合を含みます。オフラインモードを有効にすると、プロファイリング設定が指定され、を使用できます。
jpcontroller
および jpenable
実行ファイルに関する詳細情報は、 jpcontrollerコマンドラインリファレンスで利用できます。