1. 程式人生 > >利用jstack檢視執行緒執行狀態

利用jstack檢視執行緒執行狀態

首先一段程式碼

public class P173ThreadState {

	public static void main(String[] args) {
		new Thread(new TimeWaiting(),"TimeWaitingThread").start();
		new Thread(new Waiting(),"WaitingThread").start();
		//兩個執行緒一個會一獲取鎖,另一個一直被block,阻塞
		new Thread(new Blockd(),"BlockThread-1").start();
		new Thread(new Blockd(),"BlockThread-2").start();
	}
	//一直在sleep
	static class Waiting implements Runnable{
		@Override
		public void run() {
			while(true){
				synchronized (Waiting.class){
					try {
						Waiting.class.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
	}
	//執行緒一直在等待
	static class TimeWaiting implements Runnable{

		@Override
		public void run() {
			while(true){
				SleepUtils.second(100);
			}
		}
	}
	//執行緒得到鎖後不會釋放鎖
	static class Blockd implements Runnable{

		@Override
		public void run() {
			synchronized(Blockd.class){
				while(true){
					SleepUtils.second(100);
				}
			}
		}
		
	}

}

首先開啟dos命令,進入jdk安裝目錄

輸入Jps獲取當前程序資訊

我的程序id是:10304

D:\jdk1.7.0_80\bin>Jps
10732
10304 P173ThreadState
9568 Jps

繼續輸入:jstack 10304(這是程序ID)

結果如下:可以看到每個執行緒的狀態

D:\jdk1.7.0_80\bin>jstack 10304
2017-04-26 22:41:38
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode):

"DestroyJavaVM" prio=6 tid=0x0000000002e10800 nid=0x1858 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"BlockThread-2" prio=6 tid=0x0000000008d63000 nid=0x2574 waiting for monitor entry [0x000000000aeaf000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.yao.book.P173ThreadState$Blockd.run(P173ThreadState.java:48)
        - waiting to lock <0x00000000eb4f1c10> (a java.lang.Class for com.yao.book.P173ThreadState$Blockd)
        at java.lang.Thread.run(Unknown Source)

"BlockThread-1" prio=6 tid=0x0000000008d60000 nid=0x2b64 waiting on condition [0x000000000adaf000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at java.lang.Thread.sleep(Unknown Source)
        at java.util.concurrent.TimeUnit.sleep(Unknown Source)
        at com.yao.book.SleepUtils.second(SleepUtils.java:8)
        at com.yao.book.P173ThreadState$Blockd.run(P173ThreadState.java:48)
        - locked <0x00000000eb4f1c10> (a java.lang.Class for com.yao.book.P173ThreadState$Blockd)
        at java.lang.Thread.run(Unknown Source)

"WaitingThread" prio=6 tid=0x0000000008d59000 nid=0x234 in Object.wait() [0x000000000acae000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000eb4f0160> (a java.lang.Class for com.yao.book.P173ThreadState$Waiting)
        at java.lang.Object.wait(Object.java:503)
        at com.yao.book.P173ThreadState$Waiting.run(P173ThreadState.java:22)
        - locked <0x00000000eb4f0160> (a java.lang.Class for com.yao.book.P173ThreadState$Waiting)
        at java.lang.Thread.run(Unknown Source)

"TimeWaitingThread" prio=6 tid=0x000000000a6f3000 nid=0x283c waiting on condition [0x000000000abae000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at java.lang.Thread.sleep(Unknown Source)
        at java.util.concurrent.TimeUnit.sleep(Unknown Source)
        at com.yao.book.SleepUtils.second(SleepUtils.java:8)
        at com.yao.book.P173ThreadState$TimeWaiting.run(P173ThreadState.java:37)
        at java.lang.Thread.run(Unknown Source)

"Service Thread" daemon prio=6 tid=0x0000000008d43800 nid=0x1814 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x0000000008d31000 nid=0x20cc waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x0000000008d2f000 nid=0x14a4 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" daemon prio=10 tid=0x0000000008d2e000 nid=0x9a0 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x0000000008d2b000 nid=0x1ea0 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x0000000008cdf000 nid=0x10f4 in Object.wait() [0x000000000a0af000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000eb404858> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        - locked <0x00000000eb404858> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)

"Reference Handler" daemon prio=10 tid=0x0000000008cd4800 nid=0x1488 in Object.wait() [0x0000000009faf000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000eb404470> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:503)
        at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
        - locked <0x00000000eb404470> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x0000000008cd0800 nid=0x4fc runnable

"GC task thread#0 (ParallelGC)" prio=6 tid=0x0000000002e27000 nid=0x1ae0 runnable

"GC task thread#1 (ParallelGC)" prio=6 tid=0x0000000002e28800 nid=0x2578 runnable

"GC task thread#2 (ParallelGC)" prio=6 tid=0x0000000002e2a800 nid=0x2f18 runnable

"GC task thread#3 (ParallelGC)" prio=6 tid=0x0000000002e2c000 nid=0x19a8 runnable

"VM Periodic Task Thread" prio=10 tid=0x0000000008d4c800 nid=0x19b8 waiting on condition

JNI global references: 107


相關推薦

利用jstack檢視執行執行狀態

首先一段程式碼 public class P173ThreadState { public static void main(String[] args) { new Thread(new TimeWaiting(),"TimeWaitingThread").sta

使用jstack檢視當前程序全部執行狀態

1.使用jps 命令找到程序的PID $ jps 225648 Jps 5268 127284 Launcher 226980 Launcher 227624 ConcurrencyTest 2.使用

32-多執行--概述+Thread類+多執行的建立方式(繼承Thread類+實現Runnable介面)+Runnable介面+執行的名稱+執行狀態

一、概述 1、程序:對應的是一個應用程式在記憶體中的所屬空間。程序是不直接執行的,它只是在分配該應用程式的記憶體空間 注:如果一個程式在記憶體中開闢了空間,就代表它在執行。不執行要釋放空間 2、執行緒:程序中的一個負責程式執行的控制單元,也叫執行路徑。一個程序中可以有多個執行路徑,稱之為

【Java多執行執行狀態執行狀態

執行緒狀態:     執行緒共包括以下5種狀態。1. 新建狀態(New)  執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。2. 就緒狀態(Runnable)  也被稱為“可執行狀態”。執行緒物件被建立後,

執行執行狀態 Java

1、普通建立子執行緒 程式碼片段: public class Main { public static void main(String[] args) { MyThread t = new MyThread(); t.start(); System.out.pr

使用者態核心態程序(執行狀態的基礎

文章目錄 1 核心態、使用者態 2 程序/執行緒狀態 3 後備佇列、就緒佇列、阻塞佇列 4 參考 1 核心態、使用者態 核心態:就是執行一些特權指令。 使用者態:在核外的使用者程式不允許執行特權指令。 2 程序/執行緒狀

【面試題】多執行執行過程中,某個執行執行時,突然釋放鎖。會發生的特殊狀態

一,背景 今天在刷面試題的時候,做到一道面試題,雖然看了答案,但有一個答案還是不理解。後來研究了一下,得到結論:執行緒拿到鎖進行執行時,哪怕獲得了CPU執行權,但是那個鎖不能丟失,它後面執行的過程都需要帶著鎖,才能往下繼續執行。 二,測試程式碼 /**

執行狀態型別和相互轉換

鎖: 最主要是sleep()方法沒有釋放鎖,而wait()方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。sleep()不出讓系統資源;wait()是進入執行緒等待池等待,出讓系統資源,其他執行緒可以佔用CPU。一般wait()不會加時間限制,因為如果wait()執行緒的執行資源不夠,再出來也沒用,要

11.執行狀態執行池的構造方式,執行池的特性

一:執行緒的狀態 (1)初始狀態         實現Runnable介面和繼承Thread可以得到一個執行緒類,new一個例項出來,執行緒就進入了初始狀態。 (2) 就緒狀態       1)就緒狀態只是說你資格執行,排程程式沒有挑選到你,你就永遠是就緒狀態。

java中程序和執行以及執行狀態和方法

程序是cpu資源分配的最小單位,執行緒是cpu排程的最小單位。 一個程式至少有一個程序,一個程序至少有一個執行緒.  執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。 另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

Java多執行執行狀態以及之間的切換(轉)

 博主最近幾天在面試的時候,被面試官問到了Java多執行緒的幾種狀態,無疑博主已經把該忘記的都忘記了,很是尷尬,回到家中在網上找到一篇部落格,博主認真閱讀了此文章,寫的很詳細,現轉載分享給大家: Java中執行緒的狀態分為6種。     1. 初始(N

java執行狀態轉換

執行緒狀態圖 說明: 執行緒共包括以下5種狀態。 1. 新建狀態(New)         : 執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。 2. 就緒狀態(Runnable): 也被稱為“可執行狀態”。執行

java執行狀態變換

下面將會針這張圖對執行緒的狀態轉換來做解釋 在作業系統的課程中把執行緒大致分為了3個狀態 1.就緒狀態(執行緒對資源上鎖,但未分配時間片,等待cpu分配,隨時可以執行) 2.執行狀態(執行緒對資源上鎖,並擁有了時間片,正在執行中) 3.阻塞狀態(在執行狀態下缺失了某種資源導致執行暫

Java第十三天學習筆記~多執行執行狀態、建立執行的第二種方式、同步程式碼塊、同步函式)

                                 多執行緒 執行緒的狀態 CPU的執行資格:可以被C

執行狀態圖+無敵類比解釋

執行緒共包括以下5種狀態。 新建狀態(New):執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。 (小明,早上來到學校,想去廁所蹲坑,這就屬於新建蹲坑執行緒) 就緒狀態(Runnable): 也被稱為“可執行狀態”

執行程式設計——執行分離狀態之detached

#include <pthread.h> #include <unistd.h> #include <stdio.h> /* 執行緒控制塊 */ static pthread_t tid1; static pthread_t tid2; /* 函式返回

Java多執行(一) —— 執行狀態詳解

一、多執行緒概述  1、 程序 是一個正在執行的程式。是程式在計算機上的一次執行活動。 每一個程序執行都有一個執行順序。該順序是一個執行路徑,或者叫一個控制單元。 系統以程序為基本單位進行系統資源的排程和分配。程式要執行,系統就在記憶體中為該程式分配一塊獨立的記憶體空間,載入程式程式碼和資源進行執行。 程式

05-執行狀態以及各狀態之間的轉換詳解

執行緒被創建出來之後,它並不是會立刻執行,而是由多個執行緒進行搶佔CPU資源,那麼,哪一個執行緒搶佔到了,那一個執行緒就來執行。就像之前講的烤燒餅的例子一樣,爐子上面有多個任務在轉,轉到哪個任務(燒餅),那麼,那個任務就執行,也就是說,在這個過程中,涉及到執行緒的生命週期的問題,就是說,從執行緒的建

執行狀態轉換圖

執行緒在一定條件下。狀態會發生變化。 執行緒變化的狀態轉換圖例如以下:   1、新建狀態(New):新建立了一個執行緒物件。   2、就緒狀態(Runnable):執行緒物件建立後,其它執行緒呼叫了該物件的start()方法。 該狀態的執行緒位於可執行執行

三十七、Linux 執行——執行清理和控制函式、程序和執行啟動方式比較、執行狀態轉換

37.1 執行緒清理和控制函式 1 #include <pthread.h> 2 3 void pthread_cleanup_push(void (* rtn)(void *), void *arg); 4 void pthread_cleanup_pop(int execute);