이 기사에서는 JVM의 스레드 스택을 분석하는 방법과 스택 정보에서 문제의 근본 원인을 찾는 방법을 알려드립니다. 제 생각에는 Thread Stack Analysis 기술은 Java EE 제품 지원 엔지니어가 마스터 해야하는 기술입니다. 스레드 스택에 저장된 정보는 일반적으로 귀하의 상상력을 훨씬 뛰어 넘습니다.
저의 목표는 지난 10 년 동안 스레드 분석에 축적 된 지식과 경험을 공유하는 것입니다. 이러한 지식과 경험은 다양한 제조업체의 다양한 버전의 JVM 공급 업체에 대한 DEPTH 분석에서 얻을 수 있습니다.
이제이 기사가 북마크에 추가됩니다. 당신은 무엇을 기다리고 있습니까, 서두르고이 스레드 분석 교육 계획을 동료 및 친구들과 공유하십시오.
좋은 소리.
내 제안은이 스레드 분석 교육 계획을 완료하기 위해 나를 따라가는 것입니다. 다음은 우리가 다룰 교육 콘텐츠입니다. 동시에, 나는 모든 사람이 모든 사람과 함께 배우고 이해할 수 있도록 처리 한 실제 사례를 여러분과 공유 할 것입니다.
1) 스레드 스택 및 기본 지식 개요
2) 스레드 스택의 원리 및 관련 도구
3) 다른 JVM 스레드 스택 형식 (Sun Hotspot, IBM JRE, Oracal Jrockit)
4) 스레드 스택 로그의 소개 및 분석 방법
5) 스레드 스택 및 관련 기술의 분석
6) 일반적인 문제 템플릿 (스레딩, 죽은 자물쇠, IO 부르기 죽음, 쓰레기 재활용/OutofMemoryError 문제, 데드 사이클 등)
7) 예를 들어 스레드 스택 문제의 분석
이 일련의 교육이 당신에게 진정한 도움을주기를 바랍니다. 따라서 주간 기사 업데이트에 계속주의를 기울이십시오.
그러나 학습 과정에 질문이 있거나 기사의 내용을 이해할 수 없다면 어떻게해야합니까?
걱정하지 마세요. 저를 멘토로 대하십시오. 스레드 스택에 대한 질문이 있으시면 저에게 문제가 너무 낮을 수없는 경우). 저와 연락하는 다음 방법을 선택하십시오.
1)이 기사에서 직접 댓글을 달았습니다 (죄송하다면 익명이 될 수 있음)
2) 루트 원인 분석 포럼에 스레드 스택 데이터를 제출하십시오.
3) 이메일을 보내 주시면 주소는@[email protected]입니다
제품에서 발생하는 문제를 분석하는 데 도움이 될 수 있습니까?
물론, 당신이 기꺼이한다면, 당신은 메일 또는 포럼 루트 케이프 분석 포럼을 통해 스택 라이브 데이터를 보낼 수 있습니다. 실제 문제는 기술을 향상시키는 법을 배우는 왕입니다.
나는 모든 사람 이이 훈련을 좋아할 수 있기를 바랍니다. 그래서 나는 당신에게 고품질 자료를 제공하고 다양한 질문에 대답하기 위해 최선을 다할 것입니다.
스레드 스택 분석 기술 및 문제 모델을 소개하기 전에 먼저 기본 컨텐츠를 알려야합니다. 따라서이 게시물에서는 가장 기본적인 컨텐츠를 다루므로 모든 사람이 JVM, Middleware 및 Java EE 컨테이너 간의 상호 작용을 더 잘 이해할 수 있습니다.
Java VM 개요
Java Virtual Machine은 Jave EE 플랫폼의 기초입니다. 미들웨어 및 애플리케이션이 배치되어 실행되는 곳입니다.
JVM은 미들웨어 소프트웨어와 Java/Java EE 프로그램에 다음과 같은 사항을 제공합니다.
(바이너리 양식) Java / Java EE 프로그램 실행 환경 일부 프로그램 기능 특성 및 도구 (IO 인프라, 데이터 구조, 스레드 관리, 보안, 모니터링 등)).
쓰레기 복구의 도움으로 동적 메모리 할당 및 관리
JVM은 많은 운영 체제 (Solaris, AIX, Windows 등)를 유지할 수 있으며 실제 서버에 1에서 여러 JVM 프로세스를 설치 한 다음 1 개로 설치할 수 있습니다.
JVM과 미들웨어 간의 상호 작용
다음 다이어그램은 JVM, 미들웨어 및 애플리케이션 간의 고급 대화식 모델을 보여줍니다.
그림에 표시된 JVM, 미들웨어 및 앱 간의 간단하고 전형적인 상호 작용. 보시다시피, 표준 Java EE 애플리케이션의 스레드의 할당은 중간 부분과 JVM 사이에 완료됩니다. (물론 예외가 있습니다. 응용 프로그램은 API를 직접 호출하여 스레드를 생성 할 수 있습니다.이 접근법은 일반적이지 않으며 사용하는 동안 조심해야합니다).
동시에, 일부 스레드는 JVM에 의해 관리됩니다.
대부분의 스레드 배포는 Java EE 컨테이너에 의해 수행되므로 스레드 스택 추적을 이해하고 이해하는 것이 중요합니다 Java EE 컨테이너를 실행하려는 요청이 있습니다.
스레드 스토리지 스택의 분석의 관점에서 볼 때 JVM에서 발견 된 스레드 풀의 차이점을 이해하고 요청 유형을 식별 할 수 있습니다.
마지막 섹션에서는 Hotsop V 제공에 대한 JVM 스레드 스택의 개요를 제공합니다.
근본적인 이유 에서이 기사에 대한 스레드 스택 예제를 얻을 수 있습니다.
JVM 스레드 스택 -무엇입니까?
JVM 스레드 스택은 주어진 시간 스냅 샷으로 생성 된 모든 Java 스레드의 전체 목록을 제공 할 수 있습니다.
발견 된 모든 Java 스레드는 다음과 같은 정보를 제공합니다.
스레드의 이름; 그것은 종종 미들웨어 제조업체가 스레드의 로고를 식별하는 데 사용되며 일반적으로 할당 된 스레드 풀 이름과 상태 (실행, 블록 등)를 가져옵니다.
예를 들어 스레드 유형 및 우선 순위 : Daemon Prio = 3 ** 미들웨어 프로그램은 일반적으로 배경 보호자 형태로 스레드를 생성합니다. 이는 이러한 스레드가 배경에서 실행되고 있음을 의미합니다. Java EE 응용 프로그램 **
다음과 같은 Java 스레드 ID : TID = 0x000000011E52A800 ** 이것은 java.lang.thread.getid ()를 통해 얻은 Java 스레드 ID입니다.
NID = 0x251C **과 같은 기본 스레드 ID는 기본 스레드 ID를 사용하면 운영 체제의 관점에서 귀하를 얻을 수 있습니다.
Java 스레드 상태 및와 같은 세부 정보 : 모니터 입력 대기 [0xffffffffea5afb000] java.lang.thread.state : 블록 (개체 모니터)
** 스레드 상태가 현재 차단 된 가능한 이유를 신속하게 이해할 수 있습니다 **
Java 스레드 스택 추적은 지금까지 스레드 스택에서 찾을 수있는 가장 중요한 데이터입니다 많은 유형의 문제의 원인, 필요한 정보의 90%.
Java 스택 메모리 분해; 핫스팟 vm 1.6 버전으로 시작하여 핫스팟의 메모리 사용은 Java의 스택 메모리 (Younggen, Oldgen) 및 Permgen 공간과 같은 스레드 스택 끝에서 볼 수 있습니다. 이 정보는 빈번한 GC로 인한 문제를 분석 할 때 매우 유용합니다. 알려진 스레드 데이터 또는 모드를 사용하여 빠른 위치를 만들 수 있습니다.
Heappsynggen Total 466944K, Used 178734K [0xFFFFFFFFFF45C00000, 0xFFFFFFFFF70800000, 0XFFFFFFFFF70800000) Eden Space 233472K, 76% USED F45C00000, 0XFFFFFFFF50AB7C50,0XFFFFFFFFFF540000) From Space 233472K, 0% Used [0xffffffffffffff62400000, 0xFFFFFFF62400000,0XFFFFFFFFF70800000) E 233472K, 0% userd [0xffffffff54000000 , 0XFFFFFFFF54000000 , 0XFFFFFFFFF62400000) PSOLDGEN TOTAL 1400832K, USED 1400831K [0xffffffffef0400000, 0xffffff45c00000, 0xFFFFFFFFF45C00000) Object Space 1400832K, 99% Used [0xffffffFFFFFFFEF0400000, 0XFFFFFFFFF45BFFFFB8,0XFFFFFFFFFFF45C00000) PSPERMGEN TOTAL 262144K, USED 248475K , 0xffffffee0400000, 0xFFFFFFFFFF0400000) Object Space 262144K, 94 % used [0xffffffffed0400000 , 0xfffffedf6f08,0xffffffffffee0400000)
스레드 스택 정보의 큰 분해
모든 사람이 더 잘 이해할 수 있도록 다음 그림은이 그림에서 핫스팟 VM의 스레드 스택 정보 및 스레드 풀이 다음과 같습니다.
위의 그림에서 스레드 스택은 여러 다른 부분으로 구성되어 있음을 알 수 있습니다. 이 정보는 문제 분석에 중요하지만 다른 문제 모드의 분석은 다른 부분을 사용합니다 (문제 모드는 이후 기사에서 시뮬레이션하고 시연합니다.)
이제이 분석 예를 통해 Hotespot on -Streaded Stack 정보의 구성 요소를 자세히 설명하겠습니다.
# 전체 스레드 덤프
"Full Thread Dump"는 전역의 유일한 키워드입니다. Middleware의 출력 로그에서 찾을 수 있습니다. 이것은 스레드 스택 스냅 샷의 시작입니다.
전체 스레드 덤프 Java 핫스팟 (TM) 64 비트 서버 VM (20.0-B11 혼합 모드) :
# Java EE Middleware, 타사 및 사용자 정의 응용 프로그램 소프트웨어의 스레드
이 부분은 전체 스레드 스택의 핵심 부분이며 일반적으로 시간을 분석 해야하는 부분이기도합니다. 스택 미드 라인의 수는 사용하는 미들웨어, 세 번째 파티 라이브러리 (독립적 인 스레드가있을 수 있음) 및 응용 프로그램 (사용자 정의 스레드를 만드는 경우 일반적으로 좋은 관행이 아닙니다)에 따라 다릅니다.
이 예제 스레드 스택에서 Weblogic은 우리가 사용하는 미들웨어입니다. Weblogic 9.2에서 시작하여 관리 할 수있는 고유 스레드 풀을 사용합니다. "
"[대기] execeTheRdead : '414'는 큐의 경우 : 'weblogic.kernel.default (자체 조정)'"Daemon Prio = 3 TID = 0x000000010916A800 NID = 0x2613 개체 () [) [0xffffffffe9edff000] java.lang.thread. 상태 : java.lang.object.wait에서 대기 (객체 모니터) -<0xffffff27d44de0>에서 weating. work.work.cutethread.waitforRequest (ExecuteTread.java:160) -Locked <0xffffffffff27d44de0> (awblogic.work.executetread) c.work.executethread.run (executeread.java:181).
# 핫스팟 VM 스레드
이것은 내부 작업의 기본 작동을 위해 핫스팟 VM에서 관리하는 내부 스레드입니다. 일반적으로 (관련 스레드 스택 및 PRSTAT 또는 기본 스레드 ID를 통해)가 아니라면 CPU 점령 속도가 높지 않으면 이에 대해 너무 많은 일을 할 필요가 없습니다.
"VM 주기성 작업 스레드"PRIO = 3 TID = 0x0000000101238800 NID = 0x19 대기 대기 조건
# 핫스팟 GC 스레드
병렬 GC에 핫스팟을 사용하는 경우 (이제 여러 물리적 코어의 환경에서 일반적입니다), 기본적으로 생성 된 핫스팟 VM 또는 각 JVM이 특정 로고로 GC 스레드를 관리하면 VM의 실행이 가능합니다. 정기적 인 GC 정리는 GC 시간의 전반적인 감소를 유발합니다.
"GC 작업 스레드#0 (ParemalGC)"PRIO = 3 TID = 0x0000000100120000 NID = 0x3 런 가능 "GC Task Thread#1 (ParallelGC)"PRIO = 3 TID = 0x0000131000 NID = 0x444 RUNNABLE …………………………………………………………… …………………………………………………………………………………………………………………………………………………… ………………………………………………………………
과도한 GC 및 메모리 누출과 같은 GC와 관련된 문제가 발생하면 이러한 스레드의 기본 ID 값과 관련된 운영 체제 또는 Java 스레드를 사용할 수있게되기 때문에 중요한 데이터입니다. 맞습니다. CPP 시간은 미래에 그러한 문제를 식별하고 진단하는 방법을 배울 것입니다.
# JNI 글로벌 참조 수
JNI (Java Local Interface)의 글로벌 참조는 로컬 코드에서 Java Garbage Collector가 관리하는 Java 객체의 기본 객체에 이르기까지 "활동"은 "활동"을 방지하는 것입니다 쓰레기 수집.
동시에 JNI 관련 누출을 감지하는 JNI 참조에주의를 기울이는 것이 중요합니다.
JNI 글로벌 참조 : 1925
# Java 스택 사용보기
이 데이터는 JDK 1.6에 다시 추가되어 핫스팟 스택의 짧고 빠른 시야를 제공합니다 그리고 그 당시 특정 Java 파일 메모리 공간을 분석 (또는 제외) 할 수 있도록 별도의 스냅 샷으로 Java 더미입니다.
힙 psyounggen 총 466944k, 178734k [0xffffffffffffffffffff70800000) eden space 233472k, 76% 사용 f45c00000, 0xffffffffffffffffffffffffff54, 034002 fffffffff62400000, 0xfffffff62400000,0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffner 0xffffffff540000, 0xffffffff62400000) Psoldgen Total 1400832k, 사용 1400831k [0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffi ff45c00000) ffffffffff45bfffffb8,0xffffffffffff45c00000) pspermgen Total 262144K, 사용 된 248475k [0 xffffffffed0400000, 0xffffffffffee0400000, 0xffffffffffef0400000) 객체 262144k, 사용 된 94% [0xfffffffffed0400000,0xffffffffffff6a6f08,0xffffffffffee040000