JProfiler 도움말

JFR 스냅샷의 뷰

JFR 이벤트 브라우저 외에도, JProfiler는 전체 프로파일링 세션에서 제공되는 일부 뷰를 JFR 데이터로 채워서 사용할 수 있습니다. 이는 JFR이 메모리 할당 및 메서드 실행에 대한 데이터를 수집하기 때문에 가능합니다. 주요 제한 사항은 기록 속도가 낮아서, 문제성 핫스팟을 확인할 만큼 충분한 데이터를 얻으려면 오랜 시간이 걸릴 수 있다는 점입니다.

텔레메트리

"Recorded objects telemetry"를 제외하고, 전체 프로파일링 세션에서 제공되는 모든 텔레메트리는 일부 표시 데이터에 제한이 있지만 JFR 스냅샷에서도 사용할 수 있습니다. 메모리 텔레메트리는 GC 전용 풀을 표시하지 않으며, 스레드 텔레메트리는 스레드 상태별 스레드 수를 표시하지 않고, recorded throughput 텔레메트리는 객체 수 대신 크기를 표시하며 해제되는 객체는 표시하지 않습니다.

아래 표는 다양한 텔레메트리에서 사용되는 이벤트 타입과 "default" 및 "profile" 템플릿 모두에서 활성화되어 있는지 여부를 보여줍니다.

Telemetry Event types Enabled in profile
Memory jdk.GCHeapSummary, jdk.MetaspaceSummary all
Recorded throughput jdk.ObjectAllocationSample, jdk.ObjectAllocationInNewTLAB, jdk.ObjectAllocationOutsideTLAB profile only
GC activity jdk.GarbageCollection all
Classes jdk.ClassLoadingStatistics all
Threads jdk.JavaThreadStatistics all
CPU load jdk.CPULoad all

메모리 뷰

"Memory" 섹션에서는 두 가지 서로 다른 이벤트 타입을 사용하여 뷰에 데이터를 채웁니다. "Live objects" 뷰는 전체 가비지 컬렉션 이후 힙에 남아 있는 모든 클래스와 인스턴스 수의 통계적 표현을 보여줍니다. 이 데이터는 jdk.ObjectCount 이벤트가 활성화된 경우에만 사용할 수 있으며, 이는 기본 JFR 템플릿에서는 비활성화되어 있습니다. 그 이유는 상당한 오버헤드가 발생하기 때문입니다. 이 설정은 상위 JFR 설정의 "Garbage collector" 드롭다운에서 토글할 수 있습니다. Java 17 이전 버전에서는 이 드롭다운이 "Memory profiling"으로 표시됩니다.

jdk.ObjectCount 이벤트가 스냅샷에서 두 번 이상 기록된 경우, 뷰에서는 첫 번째와 마지막 발생 사이의 차이를 보여줍니다. 이를 통해 기록 시간 동안 값이 어떻게 변했는지 파악할 수 있으며, 메모리 누수의 징후를 제공할 수 있습니다. 이 시점이 스냅샷 기록의 시작 및 종료와 일치하지 않는 경우, 해당 북마크가 텔레메트리 뷰에 추가됩니다. 전체 객체 크기가 고정 임계값(일반적으로 힙의 1%)을 초과하는 클래스만 포함됩니다.

심도 있는 분석이 필요하다면 전체 프로파일링 세션을 사용하거나 HPROF 스냅샷을 생성하는 것을 고려하세요.

"Recorded objects" 뷰와 할당 뷰에서는 Java 16부터 jdk.ObjectAllocationSample 이벤트의 데이터를, 이전 Java 버전에서는 jdk.ObjectAllocationInNewTLABjdk.ObjectAllocationOutsideTLAB 이벤트의 데이터를 보여줍니다. 상위 UI의 "Allocation Profiling" 드롭다운에서도 이러한 이벤트 타입을 활성화할 수 있습니다.

"Live objects" 뷰와 달리, 이 뷰들은 기록이 활성화된 동안에만 할당된 객체만을 보여줍니다. 할당은 JFR에서 샘플링되지만, 크기는 전체 할당된 크기에 대한 추정치로 보고됩니다. 이러한 차이로 인해, 이 뷰에서 보고되는 크기는 샘플 수에 평균 인스턴스 크기를 곱한 값과 일치하지 않습니다. 그 외에는 전체 프로파일링 세션의 메모리 뷰와 유사한 기능을 제공합니다.

CPU 뷰

"CPU 뷰"에는 호출 트리, 핫스팟 뷰, 호출 그래프가 포함됩니다. "Runnable" 스레드 상태의 데이터는 표준 JFR 템플릿 모두에서 기본적으로 기록되는 jdk.ExecutionSample 이벤트를 기반으로 합니다. 그러나 샘플링 주기는 기본적으로 20ms로 설정되어 있으며, 이는 JFR 상위 UI의 "Method sampling" 설정에서 "Normal" 옵션에 해당합니다. JFR은 무작위 스레드 중 극히 일부만 샘플링하므로, 핫스팟이 충분히 두드러지게 나타날 만큼 충분한 데이터를 얻으려면 오랜 시간이 걸릴 수 있습니다. 필요하다면 jdk.ExecutionSample의 주기를 줄이는 것을 고려하세요. 단, 이 경우 JFR이 데이터를 누적하지 않기 때문에 스냅샷 크기가 매우 커질 수 있습니다.

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

또 다른 고려사항은, non-runnable 스레드 상태는 이벤트로부터 계산되며, 이 이벤트들은 스레드 상태 선택기 옆 툴팁에 표시되는 최소 지속 시간 임계값을 설정할 수 있습니다. 실제 총 시간은 이보다 훨씬 클 수 있습니다. 스레드 상태를 조합하는 데 사용되는 이벤트 타입은 아래 표와 같습니다:

Thread state Event types
Runnable jdk.ExecutionSample
Waiting jdk.JavaMonitorWait, jdk.ThreadSleep, jdk.ThreadPark
Blocking jdk.JavaMonitorEnter
Socket and file I/O jdk.SocketRead, jdk.SocketWrite, jdk.FileRead, jdk.FileWrite

뷰의 기능에 대한 자세한 설명은 CPU 뷰 도움말에서 확인할 수 있습니다. 전체 프로파일링 세션의 많은 기능은 JFR 환경에서는 제공되지 않는다는 점에 유의하세요.

스레드 및 모니터 뷰

시간 순서대로 기록된 메서드 샘플링 데이터를 기반으로, 스레드 히스토리 뷰를 계산할 수 있으며, 대기 및 블로킹 시간에 대한 호출 스택을 보여주는 툴팁도 포함됩니다.

스레드 덤프는 JFR과 JProfiler 모두에서 제공되는 기능이며 동일한 뷰에서 표시됩니다. 이 경우 이벤트 브라우저는 스레드 덤프 컬럼의 구조화된 내용을 표시할 수 없으므로 대체가 되지 않습니다. 스레드 덤프 뷰에서는 여러 스레드 덤프를 비교할 수도 있습니다.

프로브

전체 프로파일링 세션의 일부 JVM 프로브는 JFR 스냅샷에서도 동일한 데이터 소스를 가집니다. 이벤트 브라우저에 비해 주요 장점은 여러 관련 이벤트 타입을 결합한다는 점입니다. 아래 표는 사용 가능한 프로브와 데이터 소스로 사용되는 이벤트 타입을 보여줍니다.

Probe Event types Enabled in profile
Sockets jdk.SocketRead, jdk.SocketWrite all
Files jdk.FileRead, jdk.FileWrite all
Classes jdk.ClassLoad, jdk.ClassUnload, jdk.ClassDefine none
Exceptions jdk.JavaErrorThrow, jdk.JavaExceptionThrow errors in both, exceptions in none
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 all

클래스 로딩은 상위 JFR UI에서 별도의 체크박스로 제공되며, 이를 통해 세 가지 클래스 로딩 이벤트를 모두 활성화할 수 있습니다.

각 프로브는 여러 개의 뷰를 제공합니다. 이벤트 브라우저와 달리, 단일 이벤트가 아닌 집계된 데이터에 중점을 둡니다. 이것이 JProfiler의 프로브가 JFR 데이터 수집과 개념적으로 다른 점입니다.

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

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

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

Garbage collector 뷰는 특별한데, 전체 프로파일링 세션에서도 Java 17 이상에서는 동일한 정보를 표시할 수 있습니다. JVM 프로브 카테고리의 garbage collector 프로브가 기록될 때, 필요한 데이터를 얻기 위해 JFR 스트리밍이 사용됩니다. 자세한 내용은 garbage collector 분석 챕터를 참고하세요.