Akira's Tech Notes

Java/JVM | GNU/Linux | Emacs/Lisp | 知的好奇心駆動

header-icon
ネイティブでない日本語で思い付くことや気になることをダラダラ書く、体裁とかは気にしない。読みづらいと感じた時に随時更新する。

Java Mission Controlメモ

1 利用可能なJavaバージョン

  • Java SE Advanced (アドバンスド)
  • Java SE Suite

2 ローカルJavaプロセスの監視

監視対象Javaプロセス起動時に以下のオプションを追加する。

  • +UnlockCommercialFeatures:商用オプションロックを解除する
  • +FlightRecorder:フライドレコーダー機能を有効化する
$ java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder ......

利用可能なコマンドを確認する、jcmdコマンドにプロセスIDを引数にして実行できる コマンド一覧を表示する。

$ jcmd <pid> help
  7720:
  The following commands are available:
  JFR.stop    ★レコーディング停止
  JFR.start   ★レコーディング開始
  JFR.dump    ★レコーディング内容をダンプする
  JFR.check
  VM.native_memory
  VM.commercial_features
  ManagementAgent.stop
  ManagementAgent.start_local
  ManagementAgent.start
  Thread.print
  GC.class_histogram
  GC.heap_dump
  GC.run_finalization
  GC.run
  VM.uptime
  VM.flags
  VM.system_properties
  VM.command_line
  VM.version
  help

jcmd <pid> JFR.start でレコーディング開始、サブコマンドのヘルプは jcmd <pid> help JFR.start で見る。

$ ./jcmd 7720 JFR.start
 7720:
 Started recording 4. No limit (duration/maxsize/maxage) in use.
  
 Use JFR.dump recording=4 filename=FILEPATH to copy recording data to file.

jcmd <pid> JFR.dump でレコーディングファイルを取得する

$ ./jcmd 7720 JFR.dump recording=4 filename=/tmp/7720_002.jfr
7720:
Dumped recording 4, 378.5 kB written to:

/tmp/7720_002.jfr

jcmd <pid> JFR.stop でレコーディング終了

$ ./jcmd 7720 JFR.stop
7720:
Must provide either name or recording.

3 リモートJavaプロセスの監視

JMXポートを公開する、一番手軽な方法、jcmdコマンドを用いて、JMX remote port を臨時で空 けて接続する。

jcmd <pid> ManagementAgent.start jmxremote.port=7091 jmxremote.authenticate=false jmxremote.ssl=false

クライアントマシンのJava Mission Control(GUI)からJMX接続して、記録を行う。

4 有用なJavaオプション

4.1 -XX:StartFlightRecording

JRockit JVMで実行されるアプリケーションのフライト・レコーダ記録を開始するには、このオ プションを起動時に指定します。このオプションは、フライト・レコーダを実行時に開始する start_flightrecording診断コマンドと同等です。詳細は、Oracle JRockit JDKツールを参照し てください。

java -XX:+FlightRecorder -XX:FlightRecorderOptions=disk=true,maxchunksize=10M -XX:StartFlightRecording=filename=test.jfr myApp

4.2 -XX:+PrintFlagsFinal

JVM終了時にXXパラメータの値を標準出力にダンプする。

5 よく使うコマンド

商用機能の有効化とステータス確認 jcmd <pid> VM.commercial_features
JMX Agent のリモート起動 jcmd <pid> ManagementAgent.start
JMX Agent のローカル起動 jcmd <pid> ManagementAgent.start_local
JMX Agent の停止 jcmd <pid> ManagementAgent.stop
スレッド一覧の出力 Thread.print
concurrent のlock に関するスレッド jcmd <pid> Thread.print -l
JVM コマンドラインの表示 VM.command_line
System Properties の表示 VM.system_properties
該当VMに指定されたJVMオプションの表示 -all で全オプションと値の出力 VM.flags
GC.run System.gc() の実行
ヒープダンプ出力(HPROF形式)-all を指定しない場合にはfull gc がリクエストされる GC.heap_dump

Comments