JVMのリソース監視、確認に使うコマンド集
以下はOracle Hotspot JVM version 1.7.0_79 、
OSはCentOS 6.3で確認したもの。
[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とプロセス名が表示される。
[root@localhost bin]# jps
2163 TestJavaProcess
2247 Jps
FullGC の起こった数を確認したい/JVMのメモリ使用率を確認したい
jstat -gcutil <PID> <interval> で確認する
使い方はvmstatコマンドと似ている。
大抵はFullGCが多発して処理が遅延して、慌ててjstatで確認するパターンが多い(気がする)
[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の項目を見ればよいが、他の項目の読み方は他のサイトにも書いているので割愛。
JVMに与えられた引数が知りたい。
jps -vで確認可能。
[root@localhost bin]# jps -v
2163 TestJavaProcess
2414 Jps -Dapplication.home=/usr/java/jdk1.7.0_79 -Xms8m
JVMのシステムプロパティを取得したい。
jinfo <PID> を使う。
[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> を使えば、各オブジェクトの使用している容量のヒストグラムが取得できる。
メモリリークを疑うときには取りえずこれを眺めてみると良いかもしれない。
[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を使って解析できる。
[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が標準で付いていてお手軽。
[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でアクセスすると
解析結果が表示される。