JProfiler 도움말Download

JFR 스냅샷의 뷰


JFR 이벤트 브라우저 외에도, JProfiler는 전체 프로파일링 세션에서 사용할 수 있는 몇 가지 뷰를 사용하여 JFR 데이터를 채웁니다. 이는 JFR이 메모리 할당 및 메서드 실행에 대한 데이터를 수집하기 때문에 가능합니다. 주요 제한 사항은 녹화 속도가 낮아서 문제 있는 핫스팟을 보기에 충분한 데이터를 얻는 데 오랜 시간이 걸릴 수 있다는 것입니다.

텔레메트리

"기록된 객체 텔레메트리"를 제외하고, 전체 프로파일링 세션의 모든 텔레메트리는 JFR 스냅샷에서도 일부 표시 데이터의 제한과 함께 사용할 수 있습니다. 메모리 텔레메트리는 GC-특정 풀을 표시하지 않으며, 스레드 텔레메트리는 스레드 상태별 스레드 수를 표시하지 않으며, 기록된 처리량 텔레메트리는 객체 수 대신 크기를 표시하고 해제되는 객체를 표시하지 않습니다.

아래 표는 다양한 텔레메트리에서 사용되는 이벤트 유형과 "기본" 및 "프로파일" 템플릿 모두에서 활성화 여부를 보여줍니다.

텔레메트리이벤트 유형프로파일에서 활성화됨
메모리jdk.GCHeapSummary, jdk.MetaspaceSummary모두
기록된 처리량jdk.ObjectAllocationSample, jdk.ObjectAllocationInNewTLAB, jdk.ObjectAllocationOutsideTLAB프로파일 전용
GC 활동jdk.GarbageCollection모두
클래스jdk.ClassLoadingStatistics모두
스레드jdk.JavaThreadStatistics모두
CPU 부하jdk.CPULoad모두

메모리 뷰

"메모리" 섹션에서는 두 가지 다른 이벤트 유형을 사용하여 뷰에 데이터를 채웁니다. "라이브 객체" 뷰는 전체 가비지 컬렉션 후 힙에 남아 있는 모든 클래스와 인스턴스 수의 통계적 표현을 보여줍니다. 이 데이터는 jdk.ObjectCount 이벤트가 활성화된 경우에만 사용할 수 있으며, 이는 기본 JFR 템플릿 중 어느 것도 해당되지 않으며 상당한 오버헤드가 있기 때문입니다. 고급 JFR 구성에서 "Garbage collector" 드롭다운을 사용하여 이 설정을 전환할 수도 있습니다. Java 17 이전에는 이 드롭다운이 "메모리 프로파일링"으로 표시됩니다.

jdk.ObjectCount 이벤트가 스냅샷에서 여러 번 기록된 경우, 뷰는 jdk.ObjectCount 이벤트의 첫 번째와 마지막 발생 사이의 차이를 보여줍니다. 이렇게 하면 녹화 시간 동안 숫자가 어떻게 변했는지에 대한 감각을 얻을 수 있으며 메모리 누수의 징후를 제공할 수 있습니다. 이러한 시간이 스냅샷 녹화의 시작 및 종료 지점과 일치하지 않는 경우, 해당 북마크가 텔레메트리 뷰에 추가됩니다. 힙의 1% 이상인 총 객체 크기를 가진 클래스만 포함됩니다.

심각한 조사를 위해 전체 프로파일링 세션을 사용하거나 HPROF 스냅샷을 찍는 것을 고려하십시오.

"기록된 객체" 뷰와 할당 뷰는 Java 16 이후 jdk.ObjectAllocationSample 이벤트와 이전 Java 버전의 jdk.ObjectAllocationInNewTLABjdk.ObjectAllocationOutsideTLAB 이벤트에서 데이터를 보여줍니다. 고급 UI의 "할당 프로파일링" 드롭다운에서도 이러한 이벤트 유형을 활성화할 수 있습니다.

"라이브 객체" 뷰와 달리, 녹화가 활성화된 동안 할당된 객체만 표시됩니다. 할당은 JFR에 의해 샘플링되지만 크기는 총 할당된 크기에 대한 추정치로 보고됩니다. 이러한 불일치로 인해, 이러한 뷰에서 보고된 크기는 샘플 수에 평균 인스턴스 크기를 곱한 것과 일치하지 않습니다. 그렇지 않으면, 이러한 뷰는 전체 프로파일링 세션의 메모리 뷰와 유사한 기능을 가지고 있습니다.

CPU 뷰

"CPU 뷰"에는 호출 트리, 핫스팟 뷰 및 호출 그래프가 포함됩니다. "Runnable" 스레드 상태의 데이터는 기본적으로 표준 JFR 템플릿 모두에서 기록되는 jdk.ExecutionSample 이벤트를 기반으로 합니다. 그러나 샘플링 속도는 기본적으로 20ms로 설정되어 있으며, 이는 JFR 고급 UI의 "메서드 샘플링" 설정의 "Normal" 옵션에 해당합니다. JFR은 매우 적은 수의 임의 스레드만 샘플링하기 때문에, 핫스팟이 충분히 두드러지게 보일 만큼 충분한 데이터를 얻는 데 오랜 시간이 걸릴 수 있습니다. 필요한 경우 jdk.ExecutionSample의 주기를 줄이는 것을 고려하십시오. 이로 인해 JFR이 데이터를 누적하지 않기 때문에 매우 큰 스냅샷 크기가 될 수 있음을 유의하십시오.

스레드가 간헐적으로 샘플링되기 때문에, 전체 프로파일링 세션에서처럼 실제 실행 시간을 추정할 수 없습니다. 시간 대신, 호출 트리와 핫스팟 뷰에서는 이벤트 수가 표시됩니다. 이는 동일한 단점을 가진 비동기 샘플링과 유사합니다. 다른 JFR 스레드 상태는 "Waiting", "Blocking" 및 "Socket and file I/O"이며 여전히 시간을 측정합니다. 이러한 불일치로 인해, 스레드 상태 선택기에서 "모든 스레드 상태" 모드는 사용할 수 없습니다.

또 다른 고려 사항은 비실행 스레드 상태가 스레드 상태 선택기 옆의 도구 설명에 표시되는 구성 가능한 최소 지속 시간 임계값을 가진 이벤트에서 계산된다는 것입니다. 이러한 스레드 상태의 실제 총 시간은 훨씬 더 클 수 있습니다. 스레드 상태를 조립하는 데 사용되는 이벤트 유형이 포함된 표는 아래에 나와 있습니다:

스레드 상태이벤트 유형
Runnablejdk.ExecutionSample
Waitingjdk.JavaMonitorWait, jdk.ThreadSleep, jdk.ThreadPark
Blockingjdk.JavaMonitorEnter
Socket and file I/Ojdk.SocketRead, jdk.SocketWrite, jdk.FileRead, jdk.FileWrite

뷰의 기능은 CPU 뷰에 대한 도움말 주제에서 설명되어 있습니다. 전체 프로파일링 세션의 많은 기능이 JFR 컨텍스트에서는 사용할 수 없음을 유의하십시오.

스레드 및 모니터 뷰

연대기적 메서드 샘플링 데이터에서, 스레드 히스토리 뷰를 계산할 수 있으며, 대기 및 차단 시간에 대한 스택 트레이스를 보여주는 도구 설명도 포함됩니다.

스레드 덤프는 JFR과 JProfiler 모두에서 기능으로 제공되며 동일한 뷰에 표시됩니다. 이 경우, 이벤트 브라우저는 jdk.ThreadDump 이벤트의 스레드 덤프 열의 구조화된 내용을 표시할 방법이 없기 때문에 대체가 아닙니다. 스레드 덤프 뷰에서는 다른 스레드 덤프를 비교할 수도 있습니다.

jdk.JavaMonitorWait, jdk.ThreadSleepjdk.ThreadPark 이벤트에서, JProfiler는 차단 스레드에 대한 정보 없이 전체 프로파일링 세션과 유사한 모니터 히스토리를 계산합니다. 문제 해결에 해당 정보가 필요한 경우, 전체 프로파일링 세션으로 전환하십시오. 이는 전체 프로파일링 세션의 잠금 그래프가 JFR 스냅샷에서는 사용할 수 없음을 의미하기도 합니다. 대기 이벤트에 대한 집계 정보를 보여주는 모니터 사용 통계가 있으며 대기 시간만 표시됩니다.

프로브

전체 프로파일링 세션의 일부 JVM 프로브는 JFR 스냅샷에서 동등한 데이터 소스를 가지고 있습니다. 이벤트 브라우저에 비해 주요 장점은 여러 관련 이벤트 유형을 결합한다는 것입니다. 아래 표는 데이터 소스로 사용되는 이벤트 유형과 함께 사용할 수 있는 프로브를 보여줍니다.

프로브이벤트 유형프로파일에서 활성화됨
Socketsjdk.SocketRead, jdk.SocketWrite모두
Filesjdk.FileRead, jdk.FileWrite모두
클래스jdk.ClassLoad, jdk.ClassUnload, jdk.ClassDefine없음
예외jdk.JavaErrorThrow, jdk.JavaExceptionThrow오류는 모두, 예외는 없음
Garbage Collector jdk.GarbageCollection, jdk.GCPhasePause, jdk.YoungGarbageCollection, jdk.OldGarbageCollection, jdk.GCReferenceStatistics, jdk.GCPhasePauseLevel<n>, jdk.GCHeapSummary, jdk.MetaspaceSummary, jdk.GCHeapConfiguration, jdk.GCConfiguration, jdk.YoungGenerationConfiguration, jdk.GCSurvivorConfiguration, jdk.GCTLABConfiguration 모두

클래스 로딩은 고급 JFR UI에서 세 가지 클래스 로딩 이벤트를 모두 켜는 별도의 체크 박스를 가지고 있습니다.

각 프로브는 여러 개의 뷰를 보여줍니다. 이벤트 브라우저와 달리, 초점은 단일 이벤트가 아니라 집계된 데이터에 맞춰져 있습니다. 이것이 JProfiler의 프로브가 JFR 데이터 수집과 개념적으로 다른 점입니다.

Garbage collector 프로브를 제외하고, 모든 프로브는 다음과 같은 뷰를 가지고 있습니다: 호출 트리와 핫스팟 뷰에서는 단일 스레드 또는 스레드 그룹을 선택할 수 있으며 집계 수준도 선택할 수 있습니다. 기본적으로 모든 스레드가 표시되며 집계 수준은 "메서드"로 설정됩니다.

텔레메트리 뷰는 기록된 데이터에서 하나 이상의 텔레메트리를 표시하며, 모든 텔레메트리를 한 번에 보여주는 개요 페이지가 있습니다. 전체 텔레메트리는 텔레메트리 이름을 클릭하여 열 수 있습니다. 시간 축을 따라 드래그하여 이벤트 뷰에서 해당 이벤트를 선택할 수 있습니다.

이벤트 뷰는 JFR 브라우저의 것과 유사합니다. 그러나 여러 JFR 이벤트에 해당하는 여러 이벤트 유형을 표시하며 유형 선택기를 제공합니다. 단일 및 다중 선택에 대한 필터링 및 스택 트레이스 표시가 이벤트 브라우저와 동일하게 처리됩니다. 또한, 시간 및 메모리 측정을 위한 히스토그램 뷰가 있으며, 수평 축을 따라 드래그하여 범위를 선택할 수 있습니다.

Garbage collector 뷰는 특별하며, Java 17 이상에서 프로파일링 세션과 동일한 정보를 전체 프로파일링 세션에서 보여줄 수 있습니다. JVM 프로브 카테고리에서 garbage collector 프로브가 기록되면, 필요한 데이터를 얻기 위해 JFR 스트리밍이 사용됩니다. 자세한 내용은 garbage collector 분석 장을 참조하십시오.