JProfilerは、Gradleからのプロファイリングを特別なタスクでサポートしています。さらに、JProfilerは スナップショット操作用のコマンドライン実行ファイル をいくつか提供しており、それぞれに対応するGradleタスクがあります。
Gradleタスクの利用
JProfilerのGradleタスクをGradleビルドファイルで利用可能にするには、plugins
ブロックを使用します。
plugins {
id 'com.jprofiler' version 'X.Y.Z'
}
この目的でGradleプラグインリポジトリを使用したくない場合は、Gradleプラグインは
bin/gradle.jar ファイルに同梱されています。
次に、JProfiler GradleプラグインにJProfilerのインストール先を指定する必要があります。
jprofiler {
installDir = file('/path/to/jprofiler/home')
}
Gradleからのプロファイリング
com.jprofiler.gradle.JavaProfile型のタスクを使うことで、任意のJavaプロセスをプロファイルできます。
このクラスはGradleの組み込みクラスJavaExecを拡張しているため、プロセスの設定には同じ引数が利用できます。
テストのプロファイリングには、GradleのTestタスクを拡張したcom.jprofiler.gradle.TestProfile型のタスクを使用してください。
追加の設定を行わない場合、どちらのタスクもプロファイリングエージェントがデフォルトポート8849でJProfiler GUIからの接続を待機する 対話型のプロファイリングセッションを開始します。オフラインプロファイリングを行う場合は、下記の表に示すいくつかの属性を追加する必要があります。
| 属性 | 説明 | 必須 |
|---|---|---|
| offline | プロファイリング実行をオフラインモードにするかどうか。 |
いいえ。offlineとnowaitは同時にtrueにはできません。
|
| nowait | プロファイリングを即時開始するか、プロファイル対象JVMがJProfiler GUIからの接続を待機するかどうか。 | |
| sessionId |
どのセッションIDからプロファイリング設定を取得するかを定義します。
nowaitもofflineも設定されていない場合はGUIでプロファイリングセッションが選択されるため、効果はありません。
|
以下の場合に必須
|
| configFile | プロファイリング設定を読み込む設定ファイルを定義します。 | いいえ |
| port |
プロファイリングエージェントがJProfiler GUIからの接続を待機するポート番号を定義します。
これはリモートセッション設定で設定されたポートと同じでなければなりません。
未設定または0の場合、デフォルトポート(8849)が使用されます。
offlineが設定されている場合はGUIからの接続がないため効果はありません。
|
いいえ |
| debugOptions | チューニングやデバッグ目的で追加のライブラリパラメータを渡したい場合、この属性で指定できます。 | いいえ |
プロジェクト内でコンパイルされたmainメソッドを持つJavaクラスをプロファイルする例は以下の通りです。
task run(type: com.jprofiler.gradle.JavaProfile) {
mainClass = 'com.mycorp.MyMainClass'
classpath sourceSets.main.runtimeClasspath
offline = true
sessionId = 80
configFile = file('path/to/jprofiler_config.xml')
}
このタスクの実行例はapi/samples/offlineサンプルプロジェクトで確認できます。
標準のJavaExecタスクと異なり、JavaProfileタスクは
createProcess()を呼び出すことでバックグラウンド実行も可能です。
この機能のデモはapi/samples/mbeanサンプルプロジェクトを参照してください。
プロファイリングに必要なVMパラメータが必要な場合は、
com.jprofiler.gradle.SetAgentpathPropertyタスクがpropertyName属性で設定した名前のプロパティに割り当てます。
JProfilerプラグインを適用すると、この型のタスクsetAgentPathPropertyが自動的にプロジェクトに追加されます。
前述の例で使用されるVMパラメータを取得するには、単純に以下を追加してください。
setAgentPathProperty {
propertyName = 'profilingVmParameter'
offline = true
sessionId = 80
configFile = file('path/to/jprofiler_config.xml')
}
をプロジェクトに追加し、setAgentPathPropertyへの依存関係を他のタスクに追加します。
そのタスクの実行フェーズでプロジェクトプロパティprofilingVmParameterを利用できます。
他のタスクプロパティへこのプロパティを割り当てる場合は、doFirst {...}コードブロックで囲み、
Gradleの実行フェーズであること(設定フェーズではないこと)を保証してください。
スナップショットからのデータエクスポート
com.jprofiler.gradle.Exportタスクは、保存されたスナップショットからビューをエクスポートでき、
bin/jpexport
コマンドラインツールの引数を再現します。
以下の属性がサポートされています。
| 属性 | 説明 | 必須 |
|---|---|---|
| snapshotFile |
スナップショットファイルへのパス。.jps拡張子のファイルである必要があります。
|
はい |
| ignoreErrors |
ビューのオプションを設定できない場合にエラーを無視して次のビューに進みます。
デフォルト値はfalseで、最初のエラー発生時にエクスポートが終了します。
|
いいえ |
| csvSeparator | CSVエクスポート時のフィールド区切り文字。デフォルトは","です。 | いいえ |
| obfuscator |
選択したオブファスケータ用にクラス名やメソッド名をデオブファスケートします。
デフォルトは"none"で、他の値の場合はmappingFileオプションが必要です。
none、proguard、yguardのいずれか。
|
いいえ |
| mappingFile |
選択したオブファスケータ用のマッピングファイル。obfuscator属性が指定されている場合のみ設定可能です。
|
obfuscatorが指定されている場合のみ
|
エクスポートタスクでは、viewsメソッドを呼び出し、その中でview(name, file[, options])を
1回または複数回呼び出します。各view呼び出しは1つの出力ファイルを生成します。
name引数はビュー名です。利用可能なビュー名一覧は
jpexport
コマンドライン実行ファイルのヘルプページを参照してください。
file引数は出力ファイルで、絶対パスまたはプロジェクトからの相対パスで指定できます。
オプションのoptions引数は、選択したビューのエクスポートオプションを指定するマップです。
エクスポートタスクの使用例は以下の通りです。
task export(type: com.jprofiler.gradle.Export) {
snapshotFile = file('snapshot.jps')
views {
view('CallTree', 'callTree.html')
view('HotSpots', 'hotSpots.html',
[threadStatus: 'all', expandBacktraces: 'true'])
}
}
スナップショットの比較
bin/jpcompare
コマンドラインツールと同様に、
com.jprofiler.gradle.Compareタスクは2つ以上のスナップショットを比較できます。
利用可能な属性は以下の通りです。
| 属性 | 説明 | 必須 |
|---|---|---|
| snapshotFiles |
比較対象のスナップショットファイル。Gradleがファイルコレクションに解決できるIterableを渡せます。
スナップショットごとに個別のデオブファスケーション設定がある場合、ファイル名は <ファイル名>:<obfuscator>:<mapping file> の形式で指定できます。ここで<obfuscator>と<mapping file>は下記のグローバルオプションに対応します。 |
はい |
| obfuscator |
選択したオブファスケータ用にクラス名やメソッド名をデオブファスケートします。
デフォルトは"none"で、他の値の場合はmappingFileオプションが必要です。
none、proguard、yguardのいずれか。
|
いいえ |
| mappingFile |
選択したオブファスケータ用のマッピングファイル。obfuscator属性が指定されている場合のみ設定可能です。
|
obfuscatorが指定されている場合のみ
|
| sortByTime |
trueに設定すると、指定された全てのスナップショットファイルがファイルの更新日時でソートされます。
それ以外の場合はsnapshotFiles属性で指定された順序で比較されます。
|
いいえ |
| ignoreErrors |
比較オプションの設定時にエラーが発生した場合に無視して次の比較に進みます。
デフォルト値はfalseで、最初のエラー発生時にエクスポートが終了します。
|
いいえ |
エクスポートタスクでビューを定義するのと同様に、Compareタスクにはcomparisonsメソッドがあり、
comparison(name, file[, options])のネスト呼び出しで比較内容を定義します。
利用可能な比較名一覧は jpcompare
コマンドライン実行ファイルのヘルプページを参照してください。
compareタスクの使用例は以下の通りです。
task compare(type: com.jprofiler.gradle.Compare) {
snapshotFiles = files('snapshot1.jps', 'snapshot2.jps')
comparisons {
comparison('CallTree', 'callTree.html')
comparison('HotSpots', 'hotSpots.csv',
[valueSummation: 'total', format: 'csv'])
}
}
また、複数のスナップショットでテレメトリー比較を作成したい場合は次のようにします。
task compare(type: com.jprofiler.gradle.Compare) {
snapshotFiles = fileTree(dir: 'snapshots', include: '*.jps')
sortByTime = true
comparisons {
comparison('TelemetryHeap', 'heap.html', [valueType: 'maximum'])
comparison('ProbeTelemetry', 'jdbc.html', [probeId: 'JdbcProbe'])
}
}
ヒープスナップショットの解析
Gradleタスクcom.jprofiler.gradle.Analyzeは、
bin/jpanalyze
コマンドラインツールと同じ機能を持ちます。
このタスクは、Compareタスクと同様にsnapshotFiles属性で処理対象スナップショットを指定し、
Exportタスクと同様にobfuscatorおよびmappingfile属性でデオブファスケーションを指定します。
removeUnreferenced、retainSoft、retainWeak、
retainPhantom、retainFinalizer、retained属性は
コマンドラインツールの引数に対応します。
Analyzeタスクの使用例は以下の通りです。
task analyze(type: com.jprofiler.gradle.Analyze) {
snapshotFiles = fileTree(dir: 'snapshots', include: '*.jps')
retainWeak = true
obfuscator = 'proguard'
mappingFile = file('obfuscation.txt')
}