JProfiler ヘルプ

オフラインプロファイリング

JProfilerでアプリケーションをプロファイルする方法には、根本的に異なる2つの方法があります。デフォルトでは、JProfiler GUIをattachした状態でプロファイルします。JProfiler GUIには記録の開始・停止ボタンがあり、記録されたすべてのプロファイリングデータを表示します。

JProfiler GUIなしでプロファイルし、後で結果を分析したい場合があります。このシナリオのために、JProfilerはオフラインプロファイリングを提供しています。オフラインプロファイリングでは、JProfiler GUIに接続することなく、プロファイリングエージェントを使用してプロファイルされたアプリケーションを起動できます。

ただし、オフラインプロファイリングでも、いくつかの操作が必要です。少なくとも1つのスナップショットを保存する必要があります。そうしないと、後で分析できるプロファイリングデータが存在しません。また、CPUまたはallocationデータを確認するには、どこかの時点で記録を開始する必要があります。同様に、保存したスナップショットでヒープウォーカーを使用したい場合は、ヒープダンプをtriggerする必要があります。

プロファイリングAPI

この問題に対する最初の解決策はコントローラーAPIです。このAPIを使用すると、コード内でプログラム的にすべてのプロファイリング操作を呼び出すことができます。api/samples/offlineディレクトリには、コントローラーAPIを実際に使用する方法を示す実行可能なサンプルがあります。そのディレクトリで../gradlewを実行してコンパイルおよび実行し、テストプログラムの起動方法を理解するためにGradleビルドファイルbuild.gradleを参照してください。

Controller APIは、実行時にプロファイリング操作を管理するためのメインインターフェースです。JProfilerインストール先のbin/agent.jarに含まれているか、以下の座標でMaven依存関係として利用できます。

group: com.jprofiler
artifact: jprofiler-probe-injected
version: <JProfiler version>

Maven Centralリポジトリから取得できます。

プロファイリングAPIがアプリケーションの通常の実行中に使用された場合、APIコールは何も行わずに静かに終了します。

このアプローチの欠点は、開発中にアプリケーションのクラスパスにJProfilerエージェントlibraryを追加し、ソースコードにプロファイリング命令を追加し、プログラム的なプロファイリング操作を変更するたびにコードを再コンパイルする必要があることです。

トリガー

トリガーを使用すると、ソースコードを変更せずにJProfiler GUIですべてのプロファイリング操作を指定できます。トリガーはJProfilerの設定ファイルに保存されます。 オフラインプロファイリングを有効にして起動する際、設定ファイルとセッションIDはコマンドラインでプロファイリングエージェントに渡されるため、プロファイリングエージェントはそれらのtrigger定義を読み取ることができます。

ソースコードにAPIコールを追加するプロファイリングAPIとは対照的に、トリガーはJVM内で特定のイベントが発生したときに有効化されます。たとえば、メソッドの開始または終了時に特定のプロファイリング操作のAPIコールを追加する代わりに、メソッド呼び出しtriggerを使用できます。別のユースケースとして、定期的にスナップショットを保存するための独自のタイマースレッドを作成する代わりに、タイマートリガーを使用できます。

各トリガーには、関連するイベントが発生したときに実行されるアクションのリストがあります。これらのアクションの一部はコントローラーAPIのプロファイリング操作に対応しています。さらに、パラメーターと戻り値を含むメソッドコールを出力するアクションや、メソッドのインターセプタースクリプトを呼び出すアクションなど、コントローラーの機能を超えたアクションもあります。

オフラインプロファイリングの設定

JProfilerで起動セッションを設定している場合、メインメニューから Session→Conversion Wizards→Convert Application Session To Offline を呼び出すことで、オフラインセッションに変換できます。これにより、適切なVMパラメーターを含む起動スクリプトが作成され、JProfiler UIで使用しているのと同じセッションからプロファイリング設定が取得されます。別のコンピューターに移行する場合は、Session→Export Session Settingsを使用してセッションを設定ファイルにエクスポートし、起動スクリプト内のVMパラメーターがそのファイルを参照していることを確認する必要があります。

インテグレーションウィザードを使用してアプリケーションサーバーをプロファイルする場合、VMパラメーターがJava呼び出しに挿入されるよう変更される起動スクリプトまたは設定ファイルが常に存在します。すべてのインテグレーションウィザードには、「Startup」ステップに「Profile offline」オプションがあり、インタラクティブプロファイリングの代わりにオフラインプロファイリング用にアプリケーションサーバーを設定できます。

たとえば、インテグレーションウィザードで処理されない起動スクリプトがある場合など、Java呼び出しにVMパラメーターを自分で渡したい場合があります。そのVMパラメーターの形式は次のとおりです。

-agentpath:<path to jprofilerti library>=offline,id=<ID>[,config=<path>]

これは[Generic application]ウィザードから取得できます。

libraryパラメーターとしてofflineを渡すと、オフラインプロファイリングが有効になります。この場合、JProfiler GUIとの接続はできません。idパラメーターは、プロファイリング設定に使用する設定ファイル内のセッションを決定します。セッションのIDは、セッション設定ダイアログのApplication settingsタブの右上隅で確認できます。オプションのconfigパラメーターは設定ファイルを指定します。これはSession→Export Session Settingsを呼び出すことでエクスポートできるファイルです。このパラメーターを省略すると、標準の設定ファイルが使用されます。そのファイルはユーザーホームディレクトリの.jprofiler16ディレクトリにあります。

一般的なオフラインセッションでは、idconfigを省略し、セッション設定を-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実行ファイルの詳細については、コマンドラインリファレンスを参照してください。