JProfilerには、プロファイリングエージェントのセットアップや、コマンドラインからのプロファイリングアクションの制御を行うための多数のコマンドラインツールが含まれています。
実行中のJVMへのプロファイリングエージェントのロード
コマンドラインユーティリティ bin/jpenableを使用すると、バージョン8以降の任意の実行中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スナップショットの保存
ヒープスナップショットのみが必要な場合は、プロファイリングエージェントをVMにロードせずにHPROFスナップショットを保存するコマンドラインツール bin/jpdumpの使用を検討してください:
使用法: 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が検出された場合は、リストから1つを選択できます。
jpcontrollerはプロファイリング設定が行われているJVMにのみ接続できるため、-agentpath
VMパラメータに"nowait"オプションを指定してJVMを起動した場合は動作しません。このオプションは、統合ウィザードの「起動モード」画面ですぐに起動し、後でJProfiler GUIで接続ラジオボタンを選択し、JProfiler
GUIがまだエージェントに接続していない場合に設定されます。--offline引数を指定せずに jpenableを使用した場合も、 jpcontrollerがプロファイルされたプロセスに接続できるようになる前に、JProfiler
GUIからの接続が必要になります。
リモートコンピューター上のプロセスに接続する場合、またはJVMがバージョン8以降の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にVMパラメータとして-Djava.rmi.server.hostname=[IP
address]を追加する必要があります。
デフォルトでは、 jpcontrollerは対話型のコマンドラインユーティリティですが、手動入力を必要とせずにプロファイリングセッションを自動化することもできます。自動呼び出しでは、プロファイルされたJVMを選択するための[pid
|
host:port]と--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 <秒数> コマンドは指定された秒数だけ一時停止します。
空行と # で始まる行は無視されます。