JProfilerは、専用のタスクを使用してGradleからのプロファイリングをサポートしています。さらに、JProfilerには対応するGradleタスクを持つスナップショット操作用のコマンドライン実行ファイルが多数用意されています。
Gradleタスクの使用
GradleビルドファイルでJProfiler Gradleタスクを使用できるようにするには、pluginsブロックを使用できます。
plugins {
id 'com.jprofiler' version 'X.Y.Z'
}
この目的でGradleプラグインリポジトリを使用しない場合は、Gradleプラグインがファイルbin/gradle.jarで配布されています。
デフォルトでは、プラグインはプラグインと同じバージョンのJProfilerディストリビューションを自動プロビジョニングし、<Gradle user home>/jprofiler/distの下に保存します。キャッシュディレクトリをオーバーライドするには、jprofilerブロックでautoProvisioningCacheDirプロパティを設定します。
代わりにローカルのJProfilerインストール環境を使用したい場合は、JProfilerがインストールされている場所をJProfiler
Gradleプラグインに指定します。macOSの場合、インストールディレクトリはアプリケーションバンドルのパス(例: /Applications/JProfiler.app)になります。
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 |
設定ファイル不要(config-less)のオフラインプロファイリングにおける呼び出しツリーの収集モードを選択します。Gradleでは、com.jprofiler.buildtools.CallTreeModeの値を使用できます。文字列値にはsampling、instrumentation、instr、およびasyncがあります。
|
いいえ |
| profile, compact, ignore |
設定ファイル不要(config-less)のオフラインプロファイリング用のパッケージまたはクラスのフィルター。:で区切られたエントリを持つ文字列、または文字列のリストを指定できます。
|
いいえ |
| 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からの接続をリッスンするポート番号を定義します。これはリモートセッション構成で設定されたポートと同じである必要があります。未設定または0の場合、デフォルトのポート(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'
}
設定ファイル不要(config-less)の属性ではカバーされていない高度な設定を行うには、設定ファイルをエクスポートし、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コマンドライン実行ファイルのヘルプページで確認できます。
比較タスクの使用例は以下のとおりです:
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')
}