日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 线程状态 jstack_jstack查看jvm线程状态

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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线程状态的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。