OSSとなったJava Mission Control 7.0.0 Early-Accessを触ってみる：導入編

# はじめに
Java Misstion Control (JMC) のEA版がついに出ました！
JMCは、Javaアプリケーションの稼働詳細を分析するためのツールです。
JMCは、業務利用するには、Oracle 有償バージョン (Product Editions)を利用しなければなりませんでした。
Java Flight Recorder(JFR)とセットで利用することがほとんどなのですが、まぁ…有償版を使っていない私にとっては、縁が無いものであったのですが、Java 11よりOpenJDK側に組み込まれる予定となっていました。

 - JMC、JFRの概要 - http://www.oracle.com/webfolder/technetwork/jp/ondemand/ddd2014/B2-1.pdf
 - JEP 328:Flight Recorder - http://openjdk.java.net/jeps/328

そして・・・ついに、 **JMC 7.0.0 UPLライセンスのEA版が出ました！！！**
JMC 7.0.0 EA Builds - http://jdk.java.net/jmc/

> JMC builds
> These early-access, open-source builds are provided under the UPL .

Oracle JDKの問題で色々とありましたが、こうやって有償機能が使えるようになることは大変喜ばしいです。

# 試してみる
下記二つを行ってみます。

- JMXでのリアルタイムモニタリング
- Java Flight Recorderでの記録、参照

結果からいうと、ちゃんと動きました。

## 構成
下記と一緒です。私は基本GKEでアプリケーション動かしているので・・・。
GKE+Java環境におけるjvisualvmの利用方法 - https://qiita.com/h-r-k-matsumoto/items/6bd4ba191208745e012b


```
  +--------+      +-------------------------+     +-----------------------+
  |        |      |                         |     |                       |
  |   PC   | +--> |   GCE: tunnel serever   | +-> |   GKE: applications   |
  |        |      |                         |     |                       |
  +--------+      +-------------------------+     +-----------------------+
```

- PC端末でモニタリング。および可視化。GKEアプリケーションが、監視対象となります。
- PC端末は、Windows 10。GKEは、1.10.5-gke.3。
- tunnel serverはCentOS 7。


## 実行するアプリケーション

## アプリケーション
実行するアプリケーションは、
　https://github.com/h-r-k-matsumoto/spring-boot-sample/tree/java11
です。※java 11 tagです。

## 事前準備

### JMCのインストール
下記サイトからバイナリをダウンロードします。私の場合は、Windows/x64のexe (sha256:6888816db19c1ff7db9091a623b252ef222e83a3e9ac54dbce8982ff66875042  )
を落とし、ウィザードに従いインストールしました。
http://jdk.java.net/jmc/

特にハマる事はありませんでした。

### PC端末でSSH トンネルの作成をする
SSHでトンネル掘ります。PCマシンで下記コマンドを実行します。

```
> gcloud compute --project xxxxx ssh --zone xxxxx "tunnnel-server"  -- -N -D 7199
```

### PC端末でJMCを起動する。
jmcとコマンドを実行するだけです。スタートメニューにもあります。

## JMXでのリアルタイムモニタリング

対象の接続を右クリックし、「JMXコンソールを開始します」をクリックするだけです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/f13a9c30-8ffa-11aa-cb4b-90800583f24e.png)

下記のように、概要、メモリ、スレッド等、 jvisualvm等で閲覧できていた情報 + αの情報を確認することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/b6633d80-851e-1def-8591-82968659b23c.png)

繋がりました！


## Java Flight Recorderでの記録、参照
対象の接続を右クリックし、[ フライト記録の開始 ] をクリックします。
記録の開始画面が表示されます。とりあえず10分間記録してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/7685f875-2654-8508-911c-a299ee3c3f1b.png)

### 収集結果
計測期間が終わったら画面が表示されます。
まだ見方は分かっていないですがとりあえず無事記録を参照することができました！
これで障害追跡も・・・ものすごく楽になるのかな？？？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/734e6495-9077-6553-3361-74872b7dd57d.png)

# ハマった所

## Proxyの設定は、設定画面からやります。

下記のように起動しても、socksプロトコルのproxyは有効となりません。

```
jmc -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7199 -J-DsocksNonProxyHosts=
```

ネットワーク接続設定画面で、下記手順でプロキシの設定を行う必要があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/c10ca877-4e48-b1c3-3180-3dcdd153c1c6.png)

1. アクティブプロバイダとして「手操作」を選択
2. SOCKSプロトコルにおいて、ホスト = localhost、ポート = 7199 を入力。

## OpenJDK11-JRE-SLIMじゃFlightRecorderは動きません。
`openjdk:11-jre-slim` のイメージを使っていましたが、Flight Recorderの記録を開始すると、下記エラーが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268550/b8c582e6-a3a2-bf2d-5f4a-f4c799581784.png)

焦りますね。えっ商用機能・・・？みたいな。
大丈夫です。上記イメージには、必要なライブラリが含まれていないためでした。
`openjdk:11-jdk` のイメージを使う事で正常に動作するようになります。


# 参考資料

- JMC 7.0.0- http://jdk.java.net/jmc/
- Java Mission Control：http://www.oracle.com/technetwork/jp/java/javaseproducts/mission-control/index.html
- JMC、JFRの概要 - http://www.oracle.com/webfolder/technetwork/jp/ondemand/ddd2014/B2-1.pdf
- JEP 328:Flight Recorder - http://openjdk.java.net/jeps/328
- ちょっと気になるMisstionControlと、Oracleの話 - https://www.infoq.com/jp/news/2018/06/open-source-jmc