JProfiler 도움말

JFR 스냅샷의 뷰

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

텔레메트리

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

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

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

메모리 뷰

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

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

본격적인 조사를 위해서는 전체 프로파일링 세션을 사용하거나 HPROF 스냅샷을 생성하는 것을 고려해 보십시오.

"기록된 객체" 뷰와 할당 뷰는 Java 16 이후부터는 jdk.ObjectAllocationSample 이벤트의 데이터를, 이전 Java 버전에서는 jdk.ObjectAllocationInNewTLAB 및 jdk.ObjectAllocationOutsideTLAB 이벤트의 데이터를 보여줍니다. 상위 레벨 UI의 "Allocation Profiling" 드롭다운에서도 이러한 이벤트 유형을 활성화할 수 있는 방법을 제공합니다.

"활성 객체" 뷰와 달리, 이 뷰들은 기록이 활성화되어 있는 동안 할당된 객체만 보여줍니다. 할당은 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" 모드를 사용할 수 없습니다.

또 다른 고려 사항은 runnable이 아닌 스레드 상태는 스레드 상태 선택기 옆의 툴팁에 표시되는 구성 가능한 최소 지속 시간 임계값을 갖는 이벤트로부터 계산된다는 점입니다. 이러한 스레드 상태의 실제 총 시간은 상당히 더 클 수 있습니다. 스레드 상태를 구성하는 데 사용되는 이벤트 유형의 표는 아래와 같습니다:

스레드 상태 이벤트 유형
Runnable jdk.ExecutionSample
Waiting jdk.JavaMonitorWait, jdk.ThreadSleep, jdk.ThreadPark
Blocking jdk.JavaMonitorEnter
Socket 및 파일 I/O jdk.SocketRead, jdk.SocketWrite, jdk.FileRead, jdk.FileWrite

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

스레드 및 monitor 뷰

시간순 메서드 샘플링 데이터로부터 대기 및 차단 시간에 대한 스택 추적을 표시하는 툴팁을 포함하여 스레드 히스토리 뷰를 계산할 수 있습니다.

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

프로브

전체 프로파일링 세션의 일부 JVM 프로브는 JFR 스냅샷에서 이에 상응하는 데이터 소스를 가집니다. 이벤트 브라우저와 비교할 때 이들의 주된 이점은 관련된 여러 이벤트 유형을 결합한다는 점입니다. 아래 표는 사용 가능한 프로브와 데이터 소스로 사용되는 이벤트 유형을 보여줍니다.

프로브 이벤트 유형 프로파일에서 활성화 여부
Sockets jdk.SocketRead, jdk.SocketWrite 모두
파일 jdk.FileRead, jdk.FileWrite 모두
클래스 jdk.ClassLoad, jdk.ClassUnload, jdk.ClassDefine 없음
예외 jdk.JavaErrorThrow, jdk.JavaExceptionThrow 에러는 모두, 예외는 없음
가비지 컬렉터 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 데이터 수집과 다른 점이기도 합니다.

가비지 컬렉터 프로브를 제외하고, 모든 프로브에는 다음과 같은 뷰가 있습니다: 호출 트리 및 핫스팟 뷰를 사용하면 집계 수준뿐만 아니라 단일 스레드 또는 스레드 그룹을 선택할 수 있습니다. 기본적으로 모든 스레드가 표시되며 집계 수준은 "메서드"로 설정됩니다.

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

이벤트 뷰는 JFR 브라우저의 이벤트 뷰와 유사합니다. 하지만 기본 JFR 이벤트에 해당하는 여러 이벤트 유형을 보여주고 유형 선택기를 제공합니다. 단일 및 다중 선택에 대한 필터링과 스택 추적 표시는 이벤트 브라우저에서와 동일하게 처리됩니다. 또한 가로축을 따라 드래그하여 범위를 선택할 수 있는 시간 및 메모리 측정용 히스토그램 뷰도 있습니다.

가비지 컬렉터 뷰는 전체 프로파일링 세션에서 Java 17 이상의 프로파일링 세션과 완전히 동일한 정보를 표시할 수 있기 때문에 특별합니다. JVM 프로브 카테고리의 가비지 컬렉터 프로브가 기록될 때, 필요한 데이터를 가져오기 위해 JFR 스트리밍이 사용됩니다. 자세한 내용은 가비지 컬렉터 분석 장을 참조하십시오.