2009-12-01 57 views
4

Java線程的解釋線程狀態總是在以下十個狀態之一:Java線程:正在運行的JVM

NEW: Just starting up, i.e., in process of being initialized. 
NEW_TRANS: Corresponding transition state (not used, included for completness). 
IN_NATIVE: Running in native code. 
IN_NATIVE_TRANS: Corresponding transition state. 
IN_VM: Running in VM. 
IN_VM_TRANS: Corresponding transition state. 
IN_JAVA: Running in Java or in stub code. 
IN_JAVA_TRANS: Corresponding transition state (not used, included for completness). 
BLOCKED: Blocked in vm. 
BLOCKED_TRANS: Corresponding transition state. 

未使用狀態(UNINITIALIZED)已經從列表中省略。

雖然給各州的定義上面我在尋找「原則進行的大拇指」解釋給定的線程狀態設置爲正在運行的應用程序服務器。並且,更具體地:

假設一個活動應用程序使用以下線程統計(使用jstack獲得)在不同的點服務器在時間:

  • 100線程:35 BLOCKED,65 IN_NATIVE
  • 113線程: 35 BLOCKED,77 IN_NATIVE,1 IN_VM
  • 52線程:38 BLOCKED,1 IN_JAVA,6 IN_NATIVE,7 IN_VM
  • 120線程:39 BLOCKED,1 IN_JAVA,80個IN_NATIVE
  • 94線程:34 BLOCKED,59 IN_NATIVE,1 IN_NATIVE_TRANS

對於五個統計量的每個線程 - 什麼可與關於該被推斷整體JVM狀態? I.e. 「在這種情況下的JVM看起來是怠速等待請求」,「機器是忙於處理要求」等

+0

嗨,你在哪找到上述線程狀態描述? – StrikeW 2014-09-26 17:36:51

+0

線程狀態及其描述可以在[HotSpot JVM的JavaThreadState類]中找到(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/sun/jvm /hotspot/runtime/JavaThreadState.java)。 – kernelthree 2016-02-06 05:45:26

回答

4

輸出的該級別不提供足夠的信息來做出這樣的聲明。

作爲一個例子,考慮阻塞狀態:有很多事情可以導致線程被阻塞。其中兩個正在等待來自客戶端的數據,並等待數據從數據庫中返回。在第一種情況下,您的應用程序處於空閒狀態,在第二種情況下它會超載。

編輯:不具有搜索從jstack輸出,我想,這兩個條件也可以表示爲IN_NATIVE。然而,同樣的評論認爲:你不知道他們在做什麼,所以你不能對整個應用程序做任何聲明。

1

kdgregory是正確的線程狀態並不一定會顯示你想要什麼自己。然而,jstack也應該給你堆棧跟蹤,讓你看到你的程序中線程的確切位置(假設它沒有被混淆或什麼)。例如,其軌跡包含對InputStream.read()的調用的BLOCKED線程應該相當明顯。

1

我說看線程狀態時,或者確實剖析一般的數據有什麼總體有趣的是要能問自己「我沒想到這是事實?」如果您對所獲得的數據是否不好/不錯/預期/意外沒有任何意見,那麼很難做到這一點。

對於線程狀態,我認爲這是更有趣的看看個人線程的行爲,然後問自己:「我是否期望線程處於該狀態/等待該鎖持續了很長時間?只知道給定的線程被阻塞/等待等本身並不像知道它被阻塞/等待什麼那麼有趣。