2013-12-26

2013-12-26 19:05


現在実行中のJavaプロセスの「スレッドの状態」、「メモリの状況」、「一番負荷がかかっているスレッド」の確認をする方法について整理してみました。

Javaプロセスのダンプを取ろう!

現在実行中のJavaのThreadの状態やJavaプロセスのメモリの状況はJavaのダンプ(Dump)を取ることで、確認が出来ます。

1.killコマンドを利用してダンプを取る
まず、psコマンドを利用して実行中のjavaのPIDを確認します。
$ ps -ef | grep java
test  17546     1  1 Dec20         01:38:24 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/home/test/tomcat/conf/logging.properties -Xms2048m -Xmx2048m -XX:MaxPermSize=256m -Dfile.encoding=utf-8 -Dverbose:jni -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/test/tomcat/endorsed -classpath /home/test/tomcat/bin/bootstrap.jar -Dcatalina.base=/home/test/tomcat -Dcatalina.home=/home/test/tomcat -Djava.io.tmpdir=/home/test/tomcat/temp org.apache.catalina.startup.Bootstrap start
test  29257 21592  0 14:59 pts/2    00:00:00 grep java

killコマンドを利用して先ほどのPIDのダンプを取ります。
kill -3 [JavaプロセスのPID]

$ kill -3 17546

取ったダンプはTomcatのLOG(catalina.out)に出力されます。
$ vi /home/test/tomcat/logs/catalina.out

2013-12-26 11:55:57
Full thread dump Java HotSpot(TM) Server VM (xx.x-xxx mixed mode):

"Attach Listener" daemon prio=10 tid=0x08b40c00 nid=0x5839 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"TP-Processor8" daemon prio=10 tid=0x08c15400 nid=0x42de runnable [0x4775b000]
  java.lang.Thread.State: RUNNABLE
     at java.net.SocketInputStream.socketRead0(Native Method)
     at java.net.SocketInputStream.read(SocketInputStream.java:129)
     at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
     at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
     at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
     - locked <0x6cf496b0> (a java.io.BufferedInputStream)
     at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:621)
     at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:559)
     at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:686)
     at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
     at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
     at java.lang.Thread.run(Thread.java:619)

…中略…


2.JDKのjstackコマンドを利用してダンプを取る
JDKのディレクトリのjpsコマンドを利用してJavaのプロセスを確認します。

JDKのディレクトリに移動します。
$ cd /usr/local/jdk/bin/

$ ./jps -lv
29840 sun.tools.jps.Jps -Dapplication.home=/usr/local/jdk -Xms8m
17546 org.apache.catalina.startup.Bootstrap -Djava.util.logging.config.file=/home/test/tomcat/conf/logging.properties -Xms2048m -Xmx2048m -XX:MaxPermSize=256m -Dfile.encoding=utf-8 -Dverbose:jni -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/test/tomcat/endorsed -Dcatalina.base=/home/test/tomcat -Dcatalina.home=/home/test/tomcat -Djava.io.tmpdir=/home/test/tomcat/temp


JDKのjstackコマンドを利用して、該当のプロセスのダンプを出力します。

$ ./jstack 17546 > /home/test/java_dump.log
$ vi /home/test/java_dump.log

負荷がかかっているスレッドを確認する

Linuxのtopコマンドに「H」オプションつけることでThreadごとのリソース使用率の確認が出来ます。

$ top -H
top - 15:25:55 up 6 days, 21:35,  1 user,  load average: 0.29, 0.24, 0.29
Tasks: 407 total,   1 running, 406 sleeping,   0 stopped,   0 zombie
Cpu(s):  9.4%us,  0.6%sy,  0.0%ni, 89.3%id,  0.4%wa,  0.0%hi,  0.4%si,  0.0%st
Mem:   3145728k total,   557468k used,  2588260k free,        0k buffers
Swap: 11719376k total,      712k used, 11718664k free,  1800000k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
16361 test    16   0 1652m 998m  24m S   59 24.7   1:35.09 java
15431 test    16   0 1652m 998m  24m S    8 24.7  12:19.77 java
15432 test    15   0 1652m 998m  24m S    1 24.7  12:14.28 java


【Shift + p】CPU使用率でソート
【Shift + m】メモリ使用量でソート
もしくは【<,>】キーを利用してソート順を変更しながら、CPUの利用率が高いスレッドのIDを確認します。
そのスレッドIDを16進数(HEX)に変更して、先ほど取ったjavaダンプにて検索するとどのスレッドなのか確認が出来ます。

0 コメント:

コメントを投稿