JProfiler には、プロファイリングエージェントのセットアップやコマンドラインからプロファイリング操作を制御するためのコマンドラインツールがいくつか含まれています。
実行中の JVM へのプロファイリングエージェントのロード
コマンドラインユーティリティ bin/jpenable を使用すると、バージョン 6 以上の任意の実行中 JVM
にプロファイリングエージェントをロードできます。コマンドライン引数を指定することで、ユーザー入力なしでこのプロセスを自動化できます。サポートされている引数は以下の通りです。
使用法: jpenable [オプション]
jpenableは選択したローカルJVMでプロファイリングエージェントを起動し、
別のコンピューターから接続できるようにします。JProfiler GUIがローカルで実行中の場合、
この実行ファイルを使用する代わりに、JProfiler GUIから直接attachできます。
* 引数が指定されない場合、jpenableはまだプロファイルされていないローカルJVMを
検出しようとし、コマンドラインで必要な入力をすべて求めます。
* 以下の引数を使用すると、コマンドラインでユーザー入力の一部または
すべてを指定できます:
-d --pid=<PID> プロファイルするJVMのPID
-n --noinput いかなる場合もユーザー入力を求めない
-h --help このヘルプを表示する
--options=<OPT> エージェントに渡すデバッグオプション
GUIモード: (デフォルト)
-g --gui JProfiler GUIを使用してJVMにattachする
-p --port=<nnnnn> プロファイリングエージェントがJProfiler GUIからの
接続を待ち受けるポート
-a --address=<IP> プロファイリングエージェントが待ち受けるアドレス。
このパラメーターを指定しない場合、attachはlocalhostから
のみ可能です。すべてのアドレスで待ち受けるには0.0.0.0を使用してください
オフラインモード:
-o --offline JVMをオフラインモードでプロファイルする
-c --config=<PATH> プロファイリング設定を含む設定ファイルへのパス
-i --id=<ID> 設定ファイル内のsessionのID。設定ファイルに
単一のsessionのみが含まれる場合は不要です。
設定ファイルなしのオフラインsession設定:
--call-tree-mode=<sampling|instr|async>
呼び出しツリーの収集モード
--profile=<LIST>
プロファイルするパッケージまたはクラス(':'で区切る)
--compact=<LIST>
コンパクト化するパッケージまたはクラス(':'で区切る)
--ignore=<LIST>
無視するパッケージまたはクラス(':'で区切る)
--line-numbers=<true|false>
行番号を記録する
設定ファイルなしのオフライン自動記録:
--snapshot=<PATH>
自動記録のスナップショットをこのパスに保存する
--recording=<LIST>
記録するデータタイプ(':'で区切る)。スレッドとテレメトリーは
常に記録されます。デフォルトはcpuです。値:
cpu, allocation, jdbc, jpa, mongo_db, cassandra, http_server, http_client, jndi, jms
kafka_producer, kafka_consumer, rmi, grpc, ai, ws, class_loader, exception, socket, file
process, gc.
--duration=<TIME>
記録時間(例: 30s、10m、1h)。このオプションを指定しない場合、
JVMが終了するまで記録が続きます。
--delay=<TIME>
記録開始前の遅延時間(例: 10s、1m)。
JVMはjpenableと同じユーザーとして実行されている必要があります。そうでない場合、
JProfilerはJVMに接続できません。
例外は、ローカルシステムアカウントで実行されているWindowsサービスです。
jpenableを使用して対話的にリストする場合です。
HPROF スナップショットの保存
ヒープスナップショットだけが必要な場合は、 bin/jpdump コマンドラインツールの利用を検討してください。このツールは、プロファイリングエージェントを VM にロードせずに
HPROF スナップショット を保存します。
使用法: jpdump [オプション]
jpdumpは、ローカルで実行中のJVMからヒープをファイルにダンプします。
Hotspot VMはHPROFファイルを生成し、OpenJ9 VMはPHDファイルを生成します。
HPROFおよびPHDファイルは、その後JProfiler GUIで開くことができます。
* 引数が指定されていない場合、jpdumpはローカルで実行中のすべてのJVMを一覧表示します。
* 次の引数を使用して、コマンドラインでユーザー入力を部分的または完全に指定できます:
-p --pid=<PID> ヒープをダンプするJVMのPID
PIDが指定されている場合、追加の質問はされません。
-a --all すべてのオブジェクトを保存します。指定されていない場合は、
生存オブジェクトのみがダンプされます。
-f --file=<PATH> ダンプファイルのパス。指定されていない場合、
ダンプファイルは現在のディレクトリに<VM名>.hprofとして書き込まれます。
ファイルが既に存在する場合、番号が追加されます。
-h --help このヘルプを表示
JVMはjpdumpと同じユーザーとして実行されている必要があることに注意してください。
そうでない場合、JProfilerは接続できません。
例外は、ローカルシステムアカウントで実行されているWindowsサービスです。
これらをjpdumpで対話的にリストする場合です。
これはプロファイリングエージェントをロードして JProfiler ヒープスナップショットを保存する場合よりもオーバーヘッドが低くなります。また、プロファイリングエージェントは一度ロードするとアンロードできないため、この方法は本番環境で稼働している JVM に適しています。
プロファイリングエージェントの制御
bin/jpcontroller 実行ファイルを引数なしで起動すると、ローカルマシン上のプロファイルされた JVM への接続を試みます。複数のプロファイルされた JVM
が検出された場合は、リストから選択できます。
jpcontroller は、プロファイリング設定がセットされている JVM にのみ接続できます。そのため、JVM が -agentpath
VM パラメータの "nowait" オプションで起動されている場合は動作しません。このオプションは、統合ウィザードの「起動モード」画面で すぐに起動し、後で JProfiler GUI で接続
ラジオボタンを選択し、まだ JProfiler GUI がエージェントに接続されていない場合に設定されます。 jpenable を
--offline 引数なしで使用する場合も、 jpcontroller がプロファイル対象プロセスに接続する前に JProfiler GUI
からの接続が必要です。
リモートコンピュータ上のプロセスに接続したい場合、または JVM がバージョン 6 以上の HotSpot JVM でない場合は、VM パラメータ
-Djprofiler.jmxServerPort=[port] をプロファイル対象 JVM に渡す必要があります。指定したポートで MBean サーバーが公開され、そのポートを
jpcontroller の引数として指定できます。さらに VM パラメータ
-Djprofiler.jmxPasswordFile=[file] を指定すると、user password
形式(スペースまたはタブ区切り)のキー・バリューペアを含むプロパティファイルで認証を設定できます。これらの VM パラメータは
com.sun.management.jmxremote.port VM パラメータによって上書きされることに注意してください。
JMX サーバーを明示的にセットアップすることで、コマンドラインコントローラーを使って jpcontroller host:port
のようにリモートサーバーへ接続できます。リモートコンピュータが IP アドレスでしか到達できない場合は、VM パラメータとして -Djava.rmi.server.hostname=[IP address]
をリモート VM に追加する必要があります。
デフォルトでは、 jpcontroller は対話型のコマンドラインユーティリティですが、手動入力なしでプロファイリングセッションを自動化することも可能です。自動化する場合は
[pid | host:port] を指定してプロファイル対象 JVM を選択し、--non-interactive
引数を渡します。さらに、コマンドのリストは stdin または --command-file 引数で指定したコマンドファイルから読み込まれます。各コマンドは新しい行から始まり、空行や "#"
コメント文字で始まる行は無視されます。
この非対話モードのコマンドは、JProfiler MBean
のメソッド名と同じです。パラメータ数も同じで、スペース区切りで指定します。文字列にスペースが含まれる場合はダブルクォートで囲む必要があります。さらに、指定した秒数だけ待機する sleep <seconds>
コマンドも用意されています。これにより、記録を開始し、一定時間待機してからスナップショットをディスクに保存することができます。
プロファイリング設定はプロファイリングエージェント内でセットする必要があることに注意してください。これは JProfiler UI で接続したときに行われます。JProfiler UI で一度も接続しない場合は、起動コマンドや jpenable で手動設定する必要があります。詳細は、起動時のプロファイリング設定に関するヘルプトピック をご覧ください。
jpcontroller のサポートされている引数は以下の通りです。
使用法: jpcontroller [オプション] [ホスト:ポート | pid]
* 引数が指定されていない場合、jpcontrollerはプロファイルされた
ローカルJVMを検出しようとします
* 単一の数字が指定された場合、jpcontrollerはプロセスID [pid] のJVMに接続を試みます。
そのJVMがプロファイルされていない場合、jpcontrollerは接続できません。
その場合は、まずjpenableユーティリティを使用してください。
* それ以外の場合、jpcontrollerは "ホスト:ポート" に接続します。ここでポートは、
プロファイルされたJVMのVMパラメータ -Djprofiler.jmxServerPort=[port] で
指定された値です。
使用可能なオプション:
-n --non-interactive コマンドのリストがstdinから読み込まれる
自動セッションを実行します。
-f --command-file=<PATH> stdinの代わりにファイルからコマンドを読み込みます。
--non-interactiveと一緒に使用する場合のみ適用されます。
非対話型コマンドの構文:
RemoteControllerMBeanのjavadoc (https://bit.ly/2DimDN5) を参照して、
操作のリストを確認してください。パラメータはスペースで区切られ、
スペースを含む場合は引用符で囲む必要があります。例えば:
addBookmark "Hello world"
startCPURecording true
startProbeRecording builtin.JdbcProbe true true
sleep 10
stopCPURecording
stopProbeRecording builtin.JdbcProbe
saveSnapshot /path/to/snapshot.jps
sleep <秒数> コマンドは指定された秒数だけ一時停止します。
空行と # で始まる行は無視されます。