JVMのヒープメモリを確認する（jstat）

OSのメモリ利用量を監視する場合、vmstatなどを利用するかと存じますが、JVMのヒープメモリが確保している量や、使用量を確認する場合はjstatを利用します。通常であれば、JFRやVisualVMなどGUIツールを利用するかと存じますが、それらが利用できないような環境ではコマンドラインから情報を取得するしかありません。本投稿は、そのような環境でJVMの情報を取得した経験を踏まえて、手順を残したいと思います。

######※初めて知ったけど・・・
こんな記事を書こうとして、以下のような公式記事を見つけました。
jstatは公式のツールではなく、試験的な機能らしい
[OTN-jstat](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/jstat.html)

**環境**
・Mac OS X(10.10.5)
・java 1.8.0_92
・apache-tomcat-8.0.36

**実施内容**
Tomcatを起動しておき、 稼働しているJVMの情報をjstatで取得する

##環境の整理

**tomcatの配置と起動**

```bash:tomcat_location
$ ls -l /make
drwxr-xr-x@ 14 kusakai  wheel   476  6 21 22:42 apache-tomcat-8.0.36

$ /make/apache-tomcat-8.0.36/bin/startup.sh
Using CATALINA_BASE:   /make/apache-tomcat-8.0.36
Using CATALINA_HOME:   /make/apache-tomcat-8.0.36
Using CATALINA_TMPDIR: /make/apache-tomcat-8.0.36/temp
Using JRE_HOME:        /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
Using CLASSPATH:       /make/apache-tomcat-8.0.36/bin/bootstrap.jar:/make/apache-tomcat-8.0.36/bin/tomcat-juli.jar
Tomcat started.

$ps aux |grep java
kusakai           988   0.1  2.6  4971380 110704 s000 〜
```
##jstatの確認と実行

**javaからプロセスを確認して、情報を取得します**

```bash:jstat_command
$ jps
1121 Jps        #jpsコマンドのプロセス
988  Bootstrap  #tomcat（JVM）のプロセス

# 上のtomcat起動後、psコマンドでも出力された通り
# PID988のJVM情報を取得します

$jstat -gc 988
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
2560.0 2560.0 2540.0  0.0   32768.0  22237.8   44032.0    15113.8   16256.0 15773.4 1920.0 1776.1      4    0.036   0      0.000    0.036
```

それぞれの意味は、以下リンク先の通りです
[公式ドキュメント](https://docs.oracle.com/javase/jp/6/technotes/tools/share/jstat.html#output_options)


##jstatの出力と、VisualVMの出力を比較する
**VisualVM**

```bash:VisualVM
$ /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/bin/jvisualvm
```

![visualvm.png](https://qiita-image-store.s3.amazonaws.com/0/110457/0ccedb42-c3fa-2077-158f-288921f3228c.png)
**jstat**

```bash:jstat_command
$ jstat -gc 988
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
9216.0 6144.0  0.0   5895.0 30720.0  16788.6   40448.0    16309.2   27136.0 26181.9 3072.0 2731.4      7    0.073   1      0.080    0.153
9216.0 6144.0  0.0   5895.0 30720.0  17003.7   40448.0    16309.2   27136.0 26181.9 3072.0 2731.4      7    0.073   1      0.080    0.153
9216.0 6144.0  0.0   5895.0 30720.0  17218.8   40448.0    16309.2   27136.0 26181.9 3072.0 2731.4      7    0.073   1      0.080    0.153
9216.0 6144.0  0.0   5895.0 30720.0  17218.8   40448.0    16309.2   27136.0 26181.9 3072.0 2731.4      7    0.073   1      0.080    0.153
9216.0 6144.0  0.0   5895.0 30720.0  17433.9   40448.0    16309.2   27136.0 26181.9 3072.0 2731.4      7    0.073   1      0.080    0.153
```

VisualVMを見ると、確保済み110 〜 120MB、使用済み25　〜 40MBとなっています。jstatでは各領域をKBで表示しているため、ほぼ同タイミングで確認してみると、、、

**確保済み領域の確認**

```
（9216.0[S0C]　+　6144.0[S1C]　+　30720.0[EC]　+　40448.0[OC]　+　27136.0[MC]） / 1024　　= 111MB
```

**使用済み領域の確認**

```
（0.0[S0U]　+　5895.0[S1U]　+　17433.9[EU]　+　16309.2[OU]） / 1024　　= 38MB
```

以上でVisualVMと同等の値が取得できています。今後、３０分程度の期間継続して情報を取得して内容を比較してみる予定です。