Java Mission Control 使ってみる

Java パフォーマンス」で目にして 項が丸々割かれている&ビジュアライズされているのでゆるふわ人間にはあっていそう。 あとで触るときに困らないように、触りはじめの部分だけ。

前提環境

起動

jmc コマンドが入っているはずなので、叩くだけ

jmc

f:id:takudo_dev:20180313194350p:plain

プロファイリング対象のプロセス起動

JFR(Java Flight Recorder。 JVM上で発生したイベントの記録) を JMCで可視化する。 JFRはデフォで有効になっていないので、Javaの起動コマンドオプションにつける

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder ※順番逆だと動かない

ローカルのSparkで使うときは、例えば以下のような感じ(※関係ないオプションもついてます)

$ spark-shell --driver-java-options "-Duser.timezone=UTC -XX:+UnlockCommercialFeatures -XX:+FlightRecorder " --packages "org.apache.hadoop:hadoop-aws:2.6.0"

MBeanサーバーというのをダブルクリックすると現状が可視化される

f:id:takudo_dev:20180313194930p:plain

JFRで記録する

f:id:takudo_dev:20180313195855p:plain

色々見れる。以下見れるもののインデックス

  • 全般タブ
    • サマリ: CPU使用率、メモリ、GC停止時間
  • モリタ
    • ヒープ
    • GC回数、GC停止時間(young, old 別など)
  • コードタブ
  • スレッド
    • 利用頻度の高いスレッド
    • スレッドダンプ
  • io
    • ファイル読み書き
    • ソケット読み書き
  • システム
    • マシン全体(JVM関係ない)
  • イベント
    • いろんなイベント見れる

f:id:takudo_dev:20180313201439p:plain

リモートのJavaプロセスをJMCでプロファイリングする

JFRのオプションに加えて、下記を追加

-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

ハマリポイント

リモートのホスト名をいじらないといけなかった。 具体的には、AWS環境(AmazonLinux)で、 デフォルトのホスト名(hostname -i で ローカルIPが返ってくる)をやめないといけない。

$ sudo hostname hogefuga

↑のホスト名はなんでも大丈夫っぽい

これでJVMブラウザから、新規の接続先を選ぶときに、ファイヤーウォールに穴をあけて(AWSの場合はセキュリティグループ)、インターネット越しに接続確認が出来た

参考

ホスト名の件はここがヒントになった

d.hatena.ne.jp

オプションはここから引っ張ってきた

qiita.com