java 线程状态 jstack_jstack查看jvm线程状态
有些時候我們需要查看下jvm中的線程執行情況,比如,發現服務器的CPU的負載突然增
高了、出現了死鎖、死循環等,我們該如何分析呢?
由于程序是正常運行的,沒有任何的輸出,從日志方面也看不出什么問題,所以就需要
看下jvm的內部線程的執行情況,然后再進行分析查找出原因。
用法:jstack
java線程的6種狀態
初始態(NEW)
創建一個Thread對象,但還未調用start()啟動線程時,線程處于初始態。
運行態(RUNNABLE),在Java中,運行態包括 就緒態 和 運行態。
就緒態
該狀態下的線程已經獲得執行所需的所有資源,只要CPU分配執行權就能運行。
所有就緒態的線程存放在就緒隊列中。
運行態
獲得CPU執行權,正在執行的線程。
由于一個CPU同一時刻只能執行一條線程,因此每個CPU每個時刻只有一條運行態的線程。
阻塞態(BLOCKED)
當一條正在執行的線程請求某一資源失敗時,就會進入阻塞態。
而在Java中,阻塞態專指請求鎖失敗時進入的狀態。
由一個阻塞隊列存放所有阻塞態的線程。
處于阻塞態的線程會不斷請求資源,一旦請求成功,就會進入就緒隊列,等待執行。
等待態(WAITING)
當前線程中調用wait、join、park函數時,當前線程就會進入等待態。
也有一個等待隊列存放所有等待態的線程。
線程處于等待態表示它需要等待其他線程的指示才能繼續運行。
進入等待態的線程會釋放CPU執行權,并釋放資源(如:鎖)
超時等待態(TIMED_WAITING)
當運行中的線程調用sleep(time)、wait、join、parkNanos、parkUntil時,就會進入該狀態;它和等待態一樣,并不是因為請求不到資源,而是主動進入,并且進入后需要其他線程喚醒;
進入該狀態后釋放CPU執行權 和 占有的資源。
與等待態的區別:到了超時時間后自動進入阻塞隊列,開始競爭鎖。
終止態(TERMINATED)
線程執行結束后的狀態。
使用jstack查找死鎖
構造死鎖
public class TestDeadLock {
private static Object obj1 = new Object();
private static Object obj2 = new Object();
public static void main(String[] args) {
new Thread(new Thread1()).start();
new Thread(new Thread2()).start();
}
private static class Thread1 implements Runnable {
@Override
public void run() {
synchronized (obj1) {
System.out.println("Thread1 拿到了 obj1 的鎖!");
try {
// 停頓2秒的意義在于,讓Thread2線程拿到obj2的鎖 Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("Thread1 拿到了 obj2 的鎖!");
}
}
}
}
private static class Thread2 implements Runnable {
@Override
public void run() {
synchronized (obj2) {
System.out.println("Thread2 拿到了 obj2 的鎖!");
try {
// 停頓2秒的意義在于,讓Thread1線程拿到obj1的鎖 Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
System.out.println("Thread2 拿到了 obj1 的鎖!");
}
}
}
}
}
jstack 11464
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x0000017bfeca3e80 (object 0x000000008a0e36e8, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x0000017bfeca5e80 (object 0x000000008a0e36f8, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at TestDeadLock$Thread2.run(TestDeadLock.java:40)
- waiting to lock <0x000000008a0e36e8> (a java.lang.Object)
- locked <0x000000008a0e36f8> (a java.lang.Object)
at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)
"Thread-0":
at TestDeadLock$Thread1.run(TestDeadLock.java:22)
- waiting to lock <0x000000008a0e36f8> (a java.lang.Object)
- locked <0x000000008a0e36e8> (a java.lang.Object)
at java.lang.Thread.run(java.base@9.0.4/Thread.java:844)
Found 1 deadlock.
VisualVM工具的使用
打開 jdk1.8.0_211\bin\jvisualvm.exe
查看CPU、內存、類、線程運行信息
查看線程狀態
總結
以上是生活随笔為你收集整理的java 线程状态 jstack_jstack查看jvm线程状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: head()函数python_Pytho
- 下一篇: 划线价格怎么弄java_京东可以设置划线