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

  • 71
    Like
  • 0
    Comment
More than 1 year has passed since last update.

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でアクセスすると
解析結果が表示される。