2009-12-01 5 views
4

자바 스레드의 해석 스레드 상태는 다음과 같은 열 가지 상태 중 하나에 항상 :자바 스레드 : 실행중인 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
  • 012,351 6,
  • 120 실 39 BLOCKED 1 IN_JAVA 80 개 IN_NATIVE
  • 94 스레드 34 BLOCKED 59 IN_NATIVE 다섯 개 통계 각 스레드 1 IN_NATIVE_TRANS

-받는 관하여 추론 할 수있는 전반적인 JVM 상태? I. "이 시나리오에서 JVM은 요청 대기 상태 인 것처럼 보입니다", "시스템이 요청 처리 중입니다."

+0

안녕하세요, 위의 스레드 상태 설명은 어디에서 찾을 수 있습니까? – StrikeW

+0

스레드 상태와 그 설명은 [HotSpot JVM의 JavaThreadState 클래스] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/sun/jvm)에서 찾을 수 있습니다. /hotspot/runtime/JavaThreadState.java). – kernelthree

답변

4

이 수준의 출력은 이러한 문을 작성하는 데 충분한 정보를 제공하지 않습니다.

예를 들어, BLOCKED 상태를 고려하십시오. 스레드를 차단할 수있는 많은 요소가 있습니다. 그 중 두 명은 클라이언트로부터 데이터가 오기를 기다리고 데이터베이스에서 데이터가 돌아 오기를 기다리고 있습니다. 첫 번째 경우에는 응용 프로그램이 유휴 상태이고 두 번째 응용 프로그램은 과부하 상태입니다.

편집 : jstack의 출력을 보지 않았으므로이 두 조건을 IN_NATIVE로 표현할 수도 있습니다. 그러나 동일한 주석이 있습니다. 사용자는 자신이하는 일을 모르기 때문에 애플리케이션 전체에 대해 어떠한 진술도 할 수 없습니다.

1

kdgregory는 스레드 상태가 반드시 사용자가 원하는 것을 드러내지 않을 것이라고 정확합니다. 그러나 jstack은 스택 추적을 제공하여 프로그램에서 스레드가 어디에 있는지 정확히 알 수 있습니다 (모호하지 않거나 무언가가 아니라고 가정). 예를 들어 InputStream.read()에 대한 호출이 포함 된 BLOCKED 스레드는 상당히 분명해야합니다.

내가 스레드 상태보고 또는 참으로 일반적으로 데이터를 프로파일 링 할 때 일반적으로 흥미로운 것을 말할 것
1

은 자신에게 물어 할 수있다 "나는이 사건 것으로 예상 했습니까?" 당신이 얻는 데이터가 좋지 않은/좋은/예상 된/예상치 못한 것인지에 대한 의견이 없다면, 그것에 대해 많은 것을하는 것이 어렵습니다. 스레드 상태로

, 나는이 개별 스레드의 행동을보고 한 후 자신을 물어 더 흥미로운 생각 "나는 그 스레드가 꽤 오랫동안 그 락을 대기/그 상태로 될 것으로 기대 했습니까?" 그리고 주어진 스레드가 차단/대기 등을 알고 있다는 것은 차단되었거나 기다리고있는 것이 무엇인지 아는 것만 큼 흥미롭지 않습니다.