リソース監視・確認コマンド逆引きメモ(Java編)   


JVMのリソース監視、確認に使うコマンド集

以下はOracle Hotspot JVM version 1.7.0_79 、
OSはCentOS 6.3で確認したもの。

```shell-session
[root@localhost opt]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

[root@localhost opt]# cat /etc/issue
CentOS release 6.3 (Final)
```

## JVMプロセスを表示したい。

とりあえずjpsコマンドを叩けば良い。
プロセスIDとプロセス名が表示される。

```shell-session
[root@localhost bin]# jps
2163 TestJavaProcess
2247 Jps
```

##FullGC の起こった数を確認したい/JVMのメモリ使用率を確認したい
jstat -gcutil \<PID\> \<interval\> で確認する
使い方はvmstatコマンドと似ている。

大抵はFullGCが多発して処理が遅延して、慌ててjstatで確認するパターンが多い(気がする)

```shell-session
[root@localhost bin]# jstat -gcutil 2163
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00  12.57   0.00  14.25      0    0.000     0    0.000    0.000
```

FullGCの発生回数はFGCの項目を見ればよいが、他の項目の読み方は[他のサイト](http://thinkit.co.jp/story/2011/03/25/2054/page/0/1)にも書いているので割愛。

## JVMに与えられた引数が知りたい。
jps -vで確認可能。

```shell-session
[root@localhost bin]# jps -v
2163 TestJavaProcess
2414 Jps -Dapplication.home=/usr/java/jdk1.7.0_79 -Xms8m
```

## JVMのシステムプロパティを取得したい。
jinfo \<PID\> を使う。


```shell-session
[root@localhost bin]# jinfo 2163                                   
Attaching to process ID 2163, please wait...                       
Debugger attached successfully.                                    
Server compiler detected.                                          
JVM version is 24.79-b02                                           
Java System Properties:                                            
                                                                   
java.runtime.name = Java(TM) SE Runtime Environment                
java.vm.version = 24.79-b02                                        
sun.boot.library.path = /usr/java/jdk1.7.0_79/jre/lib/amd64        
(・・後略・・)
```

## オブジェクトのメモリ使用量が知りたい
jmap -histo \<PID\> を使えば、各オブジェクトの使用している容量のヒストグラムが取得できる。
メモリリークを疑うときには取りえずこれを眺めてみると良いかもしれない。

```shell-session
[root@localhost bin]# jmap -histo 2163 | head

 num     #instances         #bytes  class name
----------------------------------------------
   1:          6658         857376  <methodKlass>
   2:          6658         788504  <constMethodKlass>
   3:           500         560392  <constantPoolKlass>
   4:           456         343360  <constantPoolCacheKlass>
   5:           500         336888  <instanceKlassKlass>
   6:          2017         195160  [C
   7:            32         167888  [I
```

## メモリダンプを取得したい
jmap -dump:format=b,file=\<filename\> \<PID\> で取得できる。
ダンプしたツールはVisual VMや後述のjhatを使って解析できる。

```shell-session
[root@localhost bin]# jmap -dump:format=b,file=heap.bin 2163
Dumping heap to /usr/java/jdk1.7.0_79/bin/heap.bin ...
Heap dump file created
```

## メモリダンプを解析したい
jhatが標準で付いていてお手軽。

```shell-session
[root@localhost bin]# jhat heap.bin
Reading from heap.bin...
Dump file created Mon Jun 22 16:59:44 CEST 2015
Snapshot read, resolving...
Resolving 8805 objects...
Chasing references, expect 1 dots.
Eliminating duplicate references.
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
```

上記の状態で、7000番ポートにhttpでアクセスすると
解析結果が表示される。