JProfilerでアプリケーションをプロファイルするには、根本的に異なる2つの方法があります。デフォルトでは、JProfiler GUIをattachしてプロファイルします。JProfiler GUIには記録を開始・停止するためのボタンが用意されており、記録されたすべてのプロファイリングデータが表示されます。
JProfiler GUIを使用せずにプロファイルを行い、後から結果を分析したいケースもあります。このようなシナリオのために、JProfilerはオフラインプロファイリングを提供しています。オフラインプロファイリングを使用すると、JProfiler GUIに接続する必要なく、プロファイリングエージェントとともにプロファイル対象のアプリケーションを起動できます。
ただし、オフラインプロファイリングでもいくつかのアクションを実行する必要があります。少なくとも1つのスナップショットを保存しなければ、後で分析するためのプロファイリングデータが残りません。また、CPUや割り当て(allocation)データを確認するには、任意のタイミングで記録を開始する必要があります。同様に、保存されたスナップショット内でヒープウォーカーを使用できるようにしたい場合は、ヒープダンプをトリガーする必要があります。
プロファイリングAPI
この問題に対する最初の解決策は、コントローラーAPIです。このAPIを使用すると、コード内でプログラムからすべてのプロファイリングアクションを呼び出すことができます。api/samples/offlineディレクトリには、実際にコントローラーAPIを使用する方法を示す実行可能なサンプルがあります。そのディレクトリで../gradlewを実行してコンパイルと実行を行い、テストプログラムがどのように呼び出されるかを理解するためにGradleビルドファイルbuild.gradleを確認してください。
Controller APIは、実行時にプロファイリングアクションを管理するためのメインインターフェースです。JProfilerインストール環境のbin/agent.jarに含まれているほか、以下の座標(coordinates)を持つMaven依存関係としても提供されています。
group: com.jprofiler artifact: jprofiler-controller version: <JProfiler version>
Maven Centralリポジトリから取得できます。
アプリケーションの通常実行中にプロファイリング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>]
これは[一般的なアプリケーション]ウィザードから利用できます。
ライブラリパラメータとしてofflineを渡すと、オフラインプロファイリングが有効になります。この場合、JProfiler
GUIとの接続はできません。idパラメータは、設定ファイル内のどのセッションをプロファイリング設定に使用するかを決定します。セッションのIDは、セッション設定ダイアログのアプリケーション設定タブの右上隅で確認できます。オプションのconfigパラメータは、設定ファイルを指定します。このファイルは、セッション→セッション設定のエクスポートを呼び出してエクスポートできるファイルです。パラメータを省略すると、標準の設定ファイルが使用されます。そのファイルは、ユーザーホームディレクトリ内の.jprofiler16ディレクトリにあります。
一般的なオフラインセッションでは、idおよびconfigを省略し、-agentpathパラメータでセッション設定を直接指定できます。例:
-agentpath:<path to jprofilerti library>=offline,callTreeMode=sampling,profile=com.mycorp.:org.example.
利用可能なインライン設定のリストについては、起動時のプロファイリング設定に関するヘルプトピックを参照してください。トリガーやプローブ固有の設定などの詳細設定が必要な場合にのみ、エクスポートされた設定ファイルを使用してください。
また、自動記録オプションを追加して、API呼び出しや jpcontrollerを使用せずにスナップショットを保存することもできます。
-agentpath:<path to jprofilerti library>=offline,snapshot=/path/to/snapshot.jps,recording=cpu:allocation,duration=10m
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に対するオフラインプロファイリングの有効化
コマンドラインユーティリティ bin/jpenableを使用すると、バージョン8以降の実行中のJVMでオフラインプロファイリングを開始できます。VMパラメータの場合と同様に、offlineスイッチ、セッションID、およびオプションの設定ファイルを指定する必要があります。
jpenable --offline --id=12344 --config=/path/to/jprofiler_config.xml
一般的なオフラインセッションの場合、--idおよび--configをインラインセッション設定に置き換えることができます。
jpenable --offline --call-tree-mode=sampling --profile=com.mycorp.:org.example.
ワンショット記録も同様に設定できます。
jpenable --offline --snapshot=/path/to/snapshot.jps --recording=cpu:allocation --duration=10m
このような呼び出しでは、実行中のJVMのリストからプロセスを選択する必要があります。追加の引数--pid=<PID> --noinputを使用すると、ユーザー入力をまったく必要としないようにプロセスを自動化できます。
自動記録を設定しない場合は、手動で記録を開始したり、スナップショットを保存したりする必要が生じることがあります。これは bin/jpcontrollerコマンドラインツールで可能です。
プロファイリングエージェントがロードされただけでプロファイリング設定が適用されていない場合、記録アクションをオンにすることができないため、 jpcontrollerは接続できません。これには、 jpenableでプロファイリングを有効にしたものの、offlineパラメータを指定しなかった場合も含まれます。オフラインモードを有効にすると、プロファイリング設定が指定され、 jpcontrollerを使用できるようになります。
jpenableおよび jpcontroller実行可能ファイルの詳細については、コマンドラインリファレンスを参照してください。







