2010-07-01 4 views
58

Java 응용 프로그램이 걸려있을 때이 문제를 일으키고 조사하고 싶은 유스 케이스를 모르더라도 스레드 덤프가 유용 할 수 있음을 알고 있습니다.스레드 덤프 분석 도구/방법

하지만 문제가있는 곳을 찾기 위해 스레드 덤프에서 유용한 데이터를 쉽게 파생시킬 수 있습니까? EJB 아키텍처이고 스레드 덤프에 내가보고 있어야하는 것이 확실하지 않은 많은 컨테이너 스레드가 포함되어 있기 때문에 (예 : 스레드가 내 응용 프로그램 코드를 실행하지 않음) 서버 응용 프로그램에서 매우 긴 스레드 덤프를 생성합니다. , JBoss 코드).

어제 나는 Thread Dump Analyzer 도구를 사용해 보았습니다. 이 도구는 텍스트 편집기에서 원시 스레드 덤프를 보는 것보다 낫습니다. 관심이없는 스레드를 필터링하고, 스레드 목록을보고, 스레드를 클릭하여 세부 정보를보고, 스레드 덤프를 비교하여 찾을 수 있기 때문입니다

Thread Dump Analyzer

을하지만 여전히 너무 많은 데이터를 분석 할 수있다 - 거의 300 스레드 : 긴 아래 스크린 샷을 참조 등, 스레드를 실행할 수 있습니다. 내가 관심없는 모든 JBoss 스레드를 걸러내는 데 사용할 수있는 기준을 모르겠습니다. 현재 "실행 가능한"상태에서만 또는 "조건 대기 중"및 "Object.wait에서"대기중인 스레드가 중요한지 여부를 확인해야하는지 잘 모르겠습니다.

평소 사용하는 방법과 일반적으로 사용하는 도구는 무엇입니까? 내가 "실행 가능한"상태 전용 또는 경우에 현재 스레드를보고 할 필요가있는 경우

+0

https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=2245aa39-fa5c-4475-b891-14c205f7333c – oluies

+4

이 글은 쓰레드 덤프, 설치 없음 필요한 : http://spotify.github.io/threaddump-analyzer/ –

+0

@JohanWalles 좋은 도구! – ycomp

답변

26

하나의 스레드 덤프 세트만으로 근본 원인을 찾지 못할 수 있습니다.

트릭은 각각 5 초 간격으로 4 또는 5 세트의 스레드 덤프를 가져 오는 것입니다. 마지막에는 앱 서버에서 약 20 - 25 초 정도의 작업을 수행하는 단일 로그 파일을 갖게됩니다.

중단 된 스레드 또는 장기 실행 트랜잭션이 발생하면 모든 스레드 덤프가 특정 스레드 ID가 Java 스택 추적의 같은 행에 있음을 확인할 것입니다. 간단히 말하면 트랜잭션 (EJB 또는 데이터베이스에서)은 여러 스레드 덤프에 걸쳐 있으므로 더 많은 조사가 필요합니다.

이제는 Samurai (나는 TDA를 직접 사용하지 않았습니다)을 통해이 항목을 실행하면 빨간색으로 강조 표시되므로 빠르게 클릭하여 문제가있는 줄을 알 수 있습니다.

this here의 예를 참조하십시오. 그 링크의 Samurai 출력 이미지를보십시오. 그린 셀은 괜찮습니다.빨간색과 회색 셀을보고해야합니다. 아래에있는 내 자신의 웹 응용 프로그램에서

사무라이 예 5의 범위에서 Thread'19위한 붙어 순서 '이다 - 십초

>  Thread dump 2/3 "[ACTIVE] ExecuteThread: '19' for queue: 
> 'weblogic.kernel.Default 
> (self-tuning)'" daemon prio=7 
> tid=07b06000 nid=108 lwp_id=222813 
> waiting for monitor entry 
> [2aa40000..2aa40b30]  
> java.lang.Thread.State: BLOCKED (on 
> object monitor)  at 
> com.bea.p13n.util.lease.JDBCLeaseManager.renewLease(JDBCLeaseManager.java:393) 
> - waiting to lock <735e9f88> (a com.bea.p13n.util.lease.JDBCLeaseManager) 
> at 
> com.bea.p13n.util.lease.Lease$LeaseTimer.timerExpired(Lease.java:229) 

...

> Thread dump 3/3 "[ACTIVE] 
> ExecuteThread: '19' for queue: 
> 'weblogic.kernel.Default 
> (self-tuning)'" daemon prio=7 
> tid=07b06000 nid=108 lwp_id=222813 
> waiting for monitor entry 
> [2aa40000..2aa40b30]  
> java.lang.Thread.State: BLOCKED (on 
> object monitor)  at 
> com.bea.p13n.util.lease.JDBCLeaseManager.renewLease(JDBCLeaseManager.java:393) 
> - waiting to lock <735e9f88> (a com.bea.p13n.util.lease.JDBCLeaseManager) 
> at 
> com.bea.p13n.util.lease.Lease$LeaseTimer.timerExpired(Lease.java:229) 

업데이 트를

나는 최근에 in this answer을 언급 한 Java Thread Dump Analyzer을 사용했으며 Sa와는 반대로 Tomcat에 매우 유용합니다. murai

6

잘 모르겠어요 "로 Object.wait에서" 도 중요하다 "조건에 대기"합니다.

뒤의 두

은 실제로 당신이 일을 할 것 같은 교착 상태를 진단 할 때 찾기 위해 것들입니다. "Runnable"은 스레드가 현재 뭔가를하고 있거나 CPU를 기다리고 있음을 의미합니다. "차단됨"과 "대기 중"은 교착 상태가 발생하는 것입니다.

물론 애플리케이션 컨테이너에는 합법적으로 기다리는 많은 스레드가 있습니다. 흥미로운 경우를 걸러 내려면 스택 추적을보십시오. 프레임 워크 클래스 (특히 "Worker"또는 "Queue"라고하는 클래스) 인 경우에는 괜찮습니다. 응용 프로그램 코드라면 더 자세히 살펴 봐야합니다.

27

나는 이것이 오래된 질문이라는 것을 알고있다.하지만 나는 긴 스레드 덤프를 더 읽기 쉽게 만드는 데 도움이되는 도구를 작성했다. 같은 스택 추적을 가지고 있고 특정 상태 (예를 들어, RUNNABLE 또는 차단)에있는 만 표시 스레드 수 있습니다 함께

Java Thread Dump Analysis Tool

이 도구 그룹 스레드.

코드의 동일한 위치에서 작업을 기다리는 대부분의 시간을 소비하는 수십 수백 개의 JBoss 스레드 중에서 흥미로운 스레드를 찾는 것이 조금 더 빠르며, 따라서 모두 동일한 스택 추적을 갖습니다.

+3

훌륭한 도구를 제공해 주셔서 감사합니다. 실제로 그것은 내가 원하는 것을 정확하게 수행하는 첫 번째 도구입니다. 공유해 주셔서 감사합니다. –

+0

정말 유용합니다. 나는 최근에 바람둥이의 TD에 이것을 사용했고 Blocked threads를 매우 쉽게 지적했다. – JoseK

+0

이 도구는 정말로 도움이됩니다. 간단하고 요점. +1 –