JAva高支局のjstackコマンド使用
JAva高支局のjstackコマンド使用
このコマンドは、スレッドスタック情報を分析するために使用します.このコマンドを理解するには、次の手順に従います.
コマンドラインに入り、jpsを入力してプロセスidを表示します.以下のようにします.
Testプロセスのidは5632
jstackコマンドを入力すると、次のようになります.
スレッドの状態を見るとRUNNABLE,TIMED_WAITING,WAITING.
WAITING状態では2つのケースがあり,1つはオブジェクトロックを取得したが,いくつかの条件が満たされずにwaitメソッドが呼び出された.もう1つは、オブジェクトロックが他のスレッドによって占有され、このスレッドはロックの解放を待つ.
TIMED_WAITING状態はスレッドを呼び出したsleepメソッドを表し,サブスレッドはしばらく眠る.
RUNNABLE状態はスレッドが実行中であることを示し,1つ目はスレッドが実際に実行されていること,もう1つはスレッドがIOのためにブロックされていることの2つのケースがある.
私たちはスレッドの状態を通じて、私たちのシステムの運行状況を分析することができます.例えば、IOブロックのスレッドが多いので、設計を考え直す必要があります.
このコマンドは、スレッドスタック情報を分析するために使用します.このコマンドを理解するには、次の手順に従います.
package com.test;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws InterruptedException {
Monitor monitor = new Monitor();
new Thread(new WaitThread(monitor), "##########WAIT1############").start();
new Thread(new WaitThread(monitor), "##########WAIT2############").start();
new Thread(new SleepThread(), "##########SLEEP############").start();
new Thread(new BlockThread(), "##########BLOCK############").start();
new Thread(new RunTread(), "##########RUN############").start();
}
}
/** * @author chuer * @Description: * @date 2015 5 28 2:41:32 * @version V1.0 */
class RunTread implements Runnable{
long n = 0;
@Override
public void run(){
while(true){
n++;
}
}
}
/** * @author chuer * @Description: * @date 2015 5 28 2:42:06 * @version V1.0 */
class BlockThread implements Runnable{
@Override
public void run(){
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/** * @author chuer * @Description: * @date 2015 5 28 2:42:25 * @version V1.0 */
class SleepThread implements Runnable{
@Override
public void run() {
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/** * @author chuer * @Description: * @date 2015 5 28 2:42:52 * @version V1.0 */
class WaitThread implements Runnable {
Monitor monitor;
public WaitThread(Monitor monitor) {
this.monitor = monitor;
}
@Override
public void run() {
try {
monitor.setNum(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Monitor {
private int num = 0;
public int getNum() {
return num;
}
public synchronized void setNum(int num) throws InterruptedException {
this.num = num;
if (this.num < 100) {
wait();
}
}
}
コマンドラインに入り、jpsを入力してプロセスidを表示します.以下のようにします.
C:\Users\Administrator>jps
5632 Test
3316 Jps
4284
Testプロセスのidは5632
jstackコマンドを入力すると、次のようになります.
C:\Users\Administrator>jstack 5632
2015-05-28 14:28:41
Full thread dump Java HotSpot(TM) Client VM (25.0-b70 mixed mode):
"DestroyJavaVM" #13 prio=5 os_prio=0 tid=0x0178d400 nid=0x954 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"##########RUN############" #12 prio=5 os_prio=0 tid=0x03e4c000 nid=0x1578 runnable [0x044bf000]
java.lang.Thread.State: RUNNABLE
at com.test.RunTread.run(Test.java:25)
at java.lang.Thread.run(Thread.java:744)
"##########BLOCK############" #11 prio=5 os_prio=0 tid=0x03e4b400 nid=0x1190 runnable [0x0413f000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:234)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
- locked <0x10252290> (a java.io.BufferedInputStream)
at com.test.BlockThread.run(Test.java:36)
at java.lang.Thread.run(Thread.java:744)
"##########SLEEP############" #10 prio=5 os_prio=0 tid=0x03e48400 nid=0xd70 waiting on condition [0x0456f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.test.SleepThread.run(Test.java:50)
at java.lang.Thread.run(Thread.java:744)
"##########WAIT2############" #9 prio=5 os_prio=0 tid=0x03e47000 nid=0xde4 in Object.wait() [0x0424f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x102b2400> (a com.test.Monitor)
at java.lang.Object.wait(Object.java:502)
at com.test.Monitor.setNum(Test.java:83)
- locked <0x102b2400> (a com.test.Monitor)
at com.test.WaitThread.run(Test.java:65)
at java.lang.Thread.run(Thread.java:744)
"##########WAIT1############" #8 prio=5 os_prio=0 tid=0x03e44000 nid=0xd9c in Object.wait() [0x0446f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x102b2400> (a com.test.Monitor)
at java.lang.Object.wait(Object.java:502)
at com.test.Monitor.setNum(Test.java:83)
- locked <0x102b2400> (a com.test.Monitor)
at com.test.WaitThread.run(Test.java:65)
at java.lang.Thread.run(Thread.java:744)
スレッドの状態を見るとRUNNABLE,TIMED_WAITING,WAITING.
WAITING状態では2つのケースがあり,1つはオブジェクトロックを取得したが,いくつかの条件が満たされずにwaitメソッドが呼び出された.もう1つは、オブジェクトロックが他のスレッドによって占有され、このスレッドはロックの解放を待つ.
TIMED_WAITING状態はスレッドを呼び出したsleepメソッドを表し,サブスレッドはしばらく眠る.
RUNNABLE状態はスレッドが実行中であることを示し,1つ目はスレッドが実際に実行されていること,もう1つはスレッドがIOのためにブロックされていることの2つのケースがある.
私たちはスレッドの状態を通じて、私たちのシステムの運行状況を分析することができます.例えば、IOブロックのスレッドが多いので、設計を考え直す必要があります.