JProfiler 도움말Download

스레드 프로파일링


스레드를 잘못 사용하면 여러 가지 문제를 일으킬 수 있습니다. 너무 많은 활성 스레드는 스레드 기아를 초래할 수 있으며, 스레드가 서로를 차단하여 애플리케이션의 활성도에 영향을 미치거나 잘못된 순서로 잠금을 획득하면 교착 상태로 이어질 수 있습니다. 또한, 스레드에 대한 정보는 디버깅 목적으로 중요합니다.

JProfiler에서 스레드 프로파일링은 두 개의 뷰 섹션으로 나뉩니다: "Threads" 섹션은 스레드의 생명 주기와 스레드 덤프 캡처를 다루고, "Monitors & locks" 섹션은 여러 스레드의 상호 작용을 분석하는 기능을 제공합니다.

스레드 검사

스레드 히스토리 뷰는 각 스레드를 타임라인에서 색상으로 표시된 행으로 보여주며, 색상은 기록된 스레드 상태를 나타냅니다. 스레드는 생성 시간, 이름 또는 스레드 그룹에 따라 정렬되며 이름으로 필터링할 수 있습니다. 또한, 드래그 앤 드롭을 통해 스레드의 순서를 직접 재배열할 수 있습니다. 모니터 이벤트가 기록된 경우, "Waiting" 또는 "Blocked" 상태에 있는 스레드의 일부에 마우스를 올리면 모니터 히스토리 뷰로 연결되는 관련 스택 트레이스를 볼 수 있습니다.

모든 스레드의 표 형식 뷰는 스레드 모니터 뷰에서 사용할 수 있습니다. 스레드가 생성되는 동안 CPU 기록이 활성화되어 있으면, JProfiler는 생성 스레드의 이름을 저장하고 테이블에 표시합니다. 하단에는 생성 스레드의 스택 트레이스가 표시됩니다. 성능상의 이유로 JVM에서 실제 스택 트레이스를 요청하지 않고 CPU 기록의 현재 정보를 사용합니다. 이는 스택 트레이스가 호출 트리 수집에 대한 필터 설정을 만족하는 클래스만 표시됨을 의미합니다.

프로파일링 설정에서 추정된 CPU 시간을 기록하도록 설정하면, CPU Time 열이 테이블에 추가됩니다. CPU 시간은 CPU 데이터를 기록할 때만 측정됩니다.

대부분의 디버거와 마찬가지로, JProfiler는 스레드 덤프를 가져올 수도 있습니다. 스레드 덤프의 스택 트레이스는 JVM에서 제공하는 전체 스택 트레이스이며 CPU 기록에 의존하지 않습니다. 두 개의 스레드 덤프를 선택하고 Show Difference 버튼을 클릭하면 diff 뷰어에서 다른 스레드 덤프를 비교할 수 있습니다. 또한, 단일 스레드 덤프에서 두 스레드를 선택하고 컨텍스트 메뉴에서 Show Difference를 선택하여 비교할 수도 있습니다.

스레드 덤프는 "Trigger thread dump" 트리거 액션이나 API를 통해서도 가져올 수 있습니다.

잠금 상황 분석

모든 Java 객체에는 두 가지 동기화 작업에 사용할 수 있는 관련 모니터가 있습니다: 스레드는 다른 스레드가 모니터에 대한 알림을 발행할 때까지 모니터에서 대기할 수 있거나, 모니터에 대한 잠금을 획득하여 다른 스레드가 잠금 소유권을 포기할 때까지 차단될 수 있습니다. 또한, Java는 java.util.concurrent.locks 패키지에서 더 고급 잠금 전략을 구현하기 위한 클래스를 제공합니다. 해당 패키지의 잠금은 객체의 모니터를 사용하지 않고 다른 네이티브 구현을 사용합니다.

JProfiler는 위의 두 메커니즘 모두에 대한 잠금 상황을 기록할 수 있습니다. 잠금 상황에서는 하나 이상의 스레드, 모니터 또는 java.util.concurrent.locks.Lock 인스턴스와 특정 시간 동안 대기 또는 차단 작업이 있습니다. 이러한 잠금 상황은 모니터 히스토리 뷰에서 표 형식으로, 잠금 히스토리 그래프에서 시각적으로 표시됩니다.

잠금 히스토리 그래프는 고립된 모니터 이벤트의 지속 시간보다는 관련된 모든 모니터와 스레드의 전체 관계 집합에 중점을 둡니다. 잠금 상황에 참여하는 스레드와 모니터는 파란색과 회색 직사각형으로 표시되며, 교착 상태의 일부인 경우 빨간색으로 표시됩니다. 검은색 화살표는 모니터의 소유권을 나타내고, 노란색 화살표는 대기 중인 스레드에서 관련 모니터로 확장되며, 점선 빨간색 화살표는 스레드가 모니터를 획득하려고 하며 현재 차단 중임을 나타냅니다. CPU 데이터가 기록된 경우 차단 또는 대기 화살표 위에 마우스를 올리면 스택 트레이스를 볼 수 있습니다. 이러한 도구 팁에는 모니터 히스토리 뷰의 해당 행으로 이동하는 하이퍼링크가 포함되어 있습니다.

표 형식의 모니터 히스토리 뷰는 모니터 이벤트를 보여줍니다. 이들은 열로 표시되는 지속 시간을 가지므로 테이블을 정렬하여 가장 중요한 이벤트를 찾을 수 있습니다. 표 형식 뷰에서 선택한 행에 대해 Show in Graph 액션을 사용하여 그래프로 이동할 수 있습니다.

각 모니터 이벤트에는 관련 모니터가 있습니다. Monitor Class 열은 모니터가 사용되는 인스턴스의 클래스 이름을 표시하거나 모니터와 관련된 Java 객체가 없는 경우 "[raw monitor]"를 표시합니다. 어떤 경우든 모니터에는 별도의 열에 표시되는 고유 ID가 있어 여러 이벤트에 걸쳐 동일한 모니터의 사용을 상관시킬 수 있습니다. 각 모니터 이벤트에는 작업을 수행하는 대기 스레드와 선택적으로 작업을 차단하는 소유 스레드가 있습니다. 사용 가능한 경우, 그들의 스택 트레이스는 뷰의 하단에 표시됩니다.

모니터 인스턴스에 대한 추가 질문이 있는 경우, 모니터 히스토리 뷰와 잠금 히스토리 그래프 모두에서 Show in Heap Walker 액션을 사용하여 힙 워커로 연결하고 모니터 인스턴스를 새로운 객체 집합으로 선택할 수 있습니다.

관심 이벤트 제한

모니터 이벤트를 분석하는 데 있어 근본적인 문제 중 하나는 애플리케이션이 비정상적으로 많은 모니터 이벤트를 생성할 수 있다는 것입니다. 그래서 JProfiler는 대기 및 차단 이벤트에 대해 기본 임계값을 설정하여 이벤트가 즉시 폐기되도록 합니다. 이러한 임계값은 뷰 설정에서 정의되며 더 긴 이벤트에 집중하기 위해 증가시킬 수 있습니다.

기록된 이벤트에 대해 추가로 필터를 적용할 수 있습니다. 모니터 히스토리 뷰는 뷰 상단에 임계값, 이벤트 유형 및 텍스트 필터를 제공합니다. 잠금 히스토리 그래프에서는 관심 있는 스레드나 모니터를 선택하고 표시된 엔티티가 포함된 잠금 상황만 표시할 수 있습니다. 관심 이벤트는 타임라인에서 다른 색상으로 표시되며, 해당 이벤트를 단계별로 탐색할 수 있는 보조 탐색 막대가 있습니다. 현재 이벤트가 관심 이벤트가 아닌 경우, 현재 이벤트와 다음 관심 이벤트 사이에 얼마나 많은 이벤트가 있는지 양방향으로 볼 수 있습니다.

선택한 스레드나 모니터가 있는 잠금 상황 외에도 그래프에서 제거된 잠금 상황도 표시됩니다. 이는 각 모니터 이벤트가 작업이 시작된 잠금 상황과 종료된 잠금 상황 두 가지로 정의되기 때문입니다. 또한, 완전히 비어 있는 그래프는 JVM에 더 이상 잠금이 없음을 나타내는 유효한 잠금 상황입니다.

주의를 기울여야 할 이벤트 수를 줄이는 또 다른 전략은 잠금 상황을 누적하는 것입니다. 잠금 히스토리 그래프에서는 하단에 모든 기록된 이벤트를 보여주는 타임라인이 있습니다. 클릭하고 드래그하여 시간 범위를 선택하면 포함된 모든 이벤트의 데이터가 위의 잠금 그래프에 표시됩니다. 누적된 그래프에서는 각 화살표에 동일한 유형의 여러 이벤트가 포함될 수 있습니다. 이 경우 도구 팁 창에는 이벤트 수와 포함된 모든 이벤트의 총 시간이 표시됩니다. 도구 팁 창의 드롭다운 목록에서 타임스탬프를 표시하고 다른 이벤트 간에 전환할 수 있습니다.

교착 상태 감지

"Current locking graph"와 "Current monitors" 뷰는 JProfiler UI에서 액션으로 트리거되는 "모니터 덤프"에서 작동합니다. 모니터 덤프를 사용하면 아직 진행 중인 이벤트를 검사할 수 있습니다. 여기에는 결코 완료되지 않고 히스토리 뷰에 표시될 수 없는 교착 상태가 포함됩니다.

차단 작업은 일반적으로 단명하지만, 교착 상태가 발생하면 두 뷰 모두 문제의 영구적인 뷰를 표시합니다. 또한, 현재 잠금 그래프는 교착 상태를 일으키는 스레드와 모니터를 빨간색으로 표시하여 이러한 문제를 즉시 파악할 수 있습니다.

새로운 모니터 덤프를 가져오면 두 뷰의 데이터가 교체됩니다. "Trigger monitor dump" 트리거 액션이나 API를 통해 모니터 덤프를 트리거할 수도 있습니다.

모니터 사용 통계

차단 및 대기 작업을 더 높은 관점에서 조사하기 위해 모니터 통계 뷰는 모니터 기록 데이터에서 보고서를 계산합니다. 모니터 이벤트를 모니터, 스레드 이름 또는 모니터 클래스별로 그룹화하고 각 행에 대한 누적 횟수와 지속 시간을 분석할 수 있습니다.