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が設定されている場合のみ
|
| configFile | プロファイリング設定を読み込む設定ファイルを定義します。オフラインプロファイリングでこの属性を省略した場合、以下の属性を使用して共通のセッション設定を直接設定できます。これらの属性がいずれも設定されていない場合、デフォルトのオフラインセッション設定が使用されます。 | いいえ |
| callTreeMode |
設定ファイルなしのオフラインプロファイリング用の呼び出しツリー収集モードを選択します。Gradleではcom.jprofiler.buildtools.CallTreeModeの値を使用できます。文字列値はsampling、instrumentation、instr、asyncです。
|
いいえ |
| profile, compact, ignore |
設定ファイルなしのオフラインプロファイリング用のパッケージまたはクラスフィルター。値は:で区切られたエントリを持つ文字列、または文字列のリストにできます。
|
いいえ |
| lineNumbers | 呼び出しツリーに行番号を記録するかどうか。 | いいえ |
| snapshotFile |
自動オフライン記録のスナップショットファイル。recordingなしで設定された場合、CPU データが記録されます。スレッドとテレメトリーは常に記録されます。
|
いいえ |
| recording |
自動オフライン記録のデータタイプ。値は:で区切られたエントリを持つ文字列、または文字列のリストにできます。一般的な値はcpu、allocation、jdbc、jpa、mongo_db、http_server、http_clientです。サポートされている記録値の完全なリストは、対応する-agentpathオプションの説明にあります。プローブ記録を選択するとCPUデータも記録されます。
|
いいえ。ただし設定した場合はsnapshotFileが必要 |
| duration |
自動オフライン記録の期間。例:30s、10m、1h。この属性がない場合、JVMが終了するまで記録が続き、その時点でスナップショットが保存されます。
|
いいえ。ただし設定した場合はsnapshotFileが必要 |
| delay |
自動オフライン記録が開始するまでの遅延。例:10sまたは1m。
|
いいえ。ただし設定した場合はsnapshotFileが必要 |
| port |
プロファイリングエージェントがJProfiler
GUIからの接続を待機するポート番号を定義します。これはリモートセッション設定で設定されたポートと同じである必要があります。設定されていないかゼロの場合、デフォルトポート(8849)が使用されます。offlineが設定されている場合は効果がありません。その場合、GUIからの接続はありません。
|
いいえ |
| debugOptions | チューニングまたはデバッグ目的で追加のライブラリパラメーターを渡したい場合、この属性を使用できます。 | いいえ |
含まれるプロジェクトによってコンパイルされたmainメソッドを持つJavaクラスをプロファイルする例を以下に示します:
task run(type: com.jprofiler.gradle.JavaProfile) {
mainClass = 'com.mycorp.MyMainClass'
classpath sourceSets.main.runtimeClasspath
offline = true
callTreeMode = 'sampling'
profile = ['com.mycorp.', 'org.example.']
snapshotFile = file('build/snapshots/run.jps')
recording = ['cpu', 'allocation', 'jdbc']
duration = '10m'
}
設定ファイルなしの属性でカバーされない高度な設定については、設定ファイルをエクスポートし、configFileとsessionIdで参照してください。
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
callTreeMode = 'sampling'
profile = ['com.mycorp.', 'org.example.']
}
をプロジェクトに追加し、setAgentPathPropertyへの依存関係を他のタスクに追加します。その後、そのタスクの実行フェーズでプロジェクトプロパティprofilingVmParameterを使用できます。プロパティを他のタスクプロパティに割り当てる際は、Gradleの設定フェーズではなく実行フェーズにいることを確認するために、その使用箇所をdoFirst {...}コードブロックで囲んでください。
スナップショットからのデータエクスポート
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を渡すことができます。
スナップショットファイルに個別の難読化解除設定がある場合、ファイル名は<file name>:<obfuscator>:<mapping file>の形式にできます。ここで<obfuscator>と<mapping file>は以下のグローバルオプションに対応します。 |
はい |
| obfuscator |
選択した難読化解除ツールのクラス名とメソッド名を難読化解除します。デフォルトは"none"で、他の値の場合はmappingFileオプションを指定する必要があります。none、proguard、yguardのいずれかです。
|
いいえ |
| mappingFile |
選択した難読化解除ツールのマッピングファイル。obfuscator属性が指定されている場合にのみ設定できます。
|
obfuscatorが指定されている場合のみ
|
| sortByTime |
trueに設定すると、指定されたすべてのスナップショットファイルがファイルの更新時刻でソートされます。それ以外の場合、snapshotFiles属性で指定された順序で比較されます。
|
いいえ |
| ignoreErrors |
比較のオプションを設定できない場合に発生するエラーを無視して次の比較に進みます。デフォルト値はfalseで、最初のエラーが発生した時点でエクスポートが終了します。
|
いいえ |
エクスポートされたビューがExportタスクに定義されるのと同様に、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')
}