JProfilerは、JProfiler Mavenプラグインを使用したMavenからのプロファイリングをサポートしています。さらに、JProfilerには対応するMavenゴールを持ついくつかのスナップショット操作用のコマンドライン実行可能ファイルが用意されています。
Mavenプラグインの使用
JProfiler Mavenプラグインは、Maven
Centralリポジトリから座標com.jprofiler:jprofiler-mavenで利用できます。Mavenビルドで使用するには、pom.xmlファイルのプラグインに追加します:
<build>
<plugins>
<plugin>
<groupId>com.jprofiler</groupId>
<artifactId>jprofiler-maven</artifactId>
<version>X.Y.Z</version>
...
</plugin>
</plugins>
</build>
デフォルトでは、プラグインはプラグインと同じバージョンのJProfilerディストリビューションを自動プロビジョニングします。自動プロビジョニングされたディストリビューションは、プラットフォーム固有のキャッシュディレクトリに保存されます(Windowsでは%LOCALAPPDATA%\jprofilerDist、macOSでは~/Library/Caches/jprofilerDist、Linuxでは$XDG_CACHE_HOME/jprofilerDistまたは~/.cache/jprofilerDist)。キャッシュディレクトリをオーバーライドするには、各ゴールのautoProvisioningCacheDirパラメータを設定します。
代わりにローカルのJProfilerインストール環境を使用したい場合は、jprofiler.homeプロジェクトプロパティまたは各ゴールのinstallDirパラメータを使用して、JProfilerがインストールされている場所をプラグインに指定できます。macOSでは、インストールディレクトリはアプリケーションバンドルのパス(例:
/Applications/JProfiler.app)になります。また、このプラグインはJProfilerインストール環境のbin/maven.jarファイルにも同梱されています。
すべてのゴールは、実行をスキップするためにjprofiler.skipプロパティで設定できるskipパラメータをサポートしています。
Mavenからのプロファイリング
profileゴールは、プロファイリングエージェントを使用して新しいJavaプロセスを開始します。メインクラスは必須パラメータであるmainClassで指定します。classpathScopeパラメータを使用すると、プロジェクトのランタイムまたはテストのクラスパスをプロファイルされたプロセスに追加でき、additionalClasspathパラメータで追加のクラスパス要素を追加できます。メインクラスおよびJVMの引数は、argumentsおよびjvmArgumentsパラメータで指定できます。
それ以上の設定を行わない場合、このゴールは対話型のプロファイリングセッションを開始し、プロファイリングエージェントはデフォルトポート8849でJProfiler
GUIからの接続を待機します。オフラインプロファイリングの場合、エクスポートされた設定ファイルを参照するか、JavaProfile Gradleタスクと同じパラメータを使用して、共通のセッション設定と自動記録を直接設定できます。複数の値を受け入れるパラメータには、区切り文字として,を使用します。
<plugin>
<groupId>com.jprofiler</groupId>
<artifactId>jprofiler-maven</artifactId>
<version>X.Y.Z</version>
<executions>
<execution>
<id>profile</id>
<phase>package</phase>
<goals>
<goal>profile</goal>
</goals>
<configuration>
<mainClass>com.mycorp.MyMainClass</mainClass>
<classpathScope>runtime</classpathScope>
<offline>true</offline>
<callTreeMode>sampling</callTreeMode>
<profile>com.mycorp.,org.example.</profile>
<snapshotFile>snapshots/run.jps</snapshotFile>
<recording>cpu,allocation,jdbc</recording>
<duration>10m</duration>
</configuration>
</execution>
</executions>
</plugin>
execution定義なしでコマンドラインから直接ゴールを呼び出すには、次を実行します:
mvn com.jprofiler:jprofiler-maven:X.Y.Z:profile -Djprofiler.mainClass=com.mycorp.MyMainClass
テストおよびその他のMavenプラグイン実行のプロファイリング
maven-surefire-pluginやexec-maven-pluginなど、別のMavenプラグインによって起動されるJavaプロセスにプロファイリングエージェントを追加するために、set-agentpath-propertyゴールはプロファイリングエージェントのVMパラメータをプロジェクトプロパティに設定します。デフォルトではjprofiler.agentpathプロパティが設定されますが、propertyNameパラメータを使用して別のプロパティ名を選択することもできます。プロファイリングパラメータはprofileゴールと同じです。
<plugin>
<groupId>com.jprofiler</groupId>
<artifactId>jprofiler-maven</artifactId>
<version>X.Y.Z</version>
<executions>
<execution>
<id>set-agentpath-property</id>
<phase>initialize</phase>
<goals>
<goal>set-agentpath-property</goal>
</goals>
<configuration>
<offline>true</offline>
<configFile>jprofiler_config.xml</configFile>
<sessionId>479</sessionId>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>${jprofiler.agentpath}</argLine>
</configuration>
</plugin>
スナップショットからのデータのエクスポート
exportゴールを使用すると、Export Gradleタスクと同様に、スナップショットからビューをエクスポートできます。スナップショットファイルはsnapshotFileパラメータで指定し、ビューはネストされたview要素で、そのオプションはネストされたoption要素で指定します。
<configuration>
<snapshotFile>snapshots/test.jps</snapshotFile>
<views>
<view>
<name>CallTree</name>
<file>calltree.html</file>
</view>
<view>
<name>HotSpots</name>
<file>hotspots.html</file>
<options>
<option>
<name>expandbacktraces</name>
<value>true</value>
</option>
<option>
<name>aggregation</name>
<value>class</value>
</option>
</options>
</view>
</views>
</configuration>
スナップショットの比較
compareゴールはCompare
Gradleタスクに対応し、2つ以上のスナップショット間の比較を実行します。スナップショットファイルはsnapshotFilesパラメータで指定し、比較はexportゴールのビューと同様にcomparisons要素の下にネストされます。
<configuration>
<sortByTime>true</sortByTime>
<snapshotFiles>
<snapshotFile>snapshots/test1.jps</snapshotFile>
<snapshotFile>snapshots/test2.jps</snapshotFile>
</snapshotFiles>
<comparisons>
<comparison>
<name>TelemetryHeap</name>
<file>heap.html</file>
</comparison>
<comparison>
<name>TelemetryThreads</name>
<file>threads.html</file>
<options>
<option>
<name>measurements</name>
<value>inactive,active</value>
</option>
<option>
<name>valuetype</name>
<value>bookmark</value>
</option>
<option>
<name>bookmarkname</name>
<value>test</value>
</option>
</options>
</comparison>
</comparisons>
</configuration>
ヒープスナップショットの解析
Analyze
Gradleタスクと同様に、analyzeゴールは、GUIでのアクセスを高速化するために、オフラインプロファイリングで保存されたスナップショット内のヒープスナップショット解析を準備します。処理対象のスナップショットは、snapshotFilesパラメータで指定します。
<configuration>
<snapshotFiles>
<snapshotFile>snapshots/test_heap.jps</snapshotFile>
</snapshotFiles>
</configuration>