데이터 녹화
프로파일러의 주요 목적은 일반적인 문제를 해결하는 데 유용한 다양한 소스의 런타임 데이터를 기록하는 것입니다. 이 작업의 주요 문제는 실행 중인 JVM이 엄청난 속도로 데이터를 생성한다는 것입니다. 프로파일러가 항상 모든 유형의 데이터를 기록한다면, 이는 용납할 수 없는 오버헤드를 발생시키거나 사용 가능한 모든 메모리를 빠르게 소모할 것입니다. 또한, 특정 사용 사례 주위의 데이터를 기록하고 관련 없는 활동은 보지 않기를 원할 때가 많습니다.
이러한 이유로 JProfiler는 실제로 관심 있는 정보의 기록을 제어하기 위한 세밀한 메커니즘을 제공합니다.
스칼라 값 및 텔레메트리
프로파일러의 관점에서 가장 문제가 적은 데이터 형태는 스칼라 값입니다. 예를 들어, 활성 스레드의 수나 열린 JDBC 연결의 수입니다. JProfiler는 이러한 값을 고정된 거시적 빈도로 샘플링할 수 있으며, 일반적으로 초당 한 번씩 시간 경과에 따른 변화를 보여줍니다. JProfiler에서 이러한 데이터를 보여주는 뷰는 텔레메트리라고 합니다. 대부분의 텔레메트리는 측정의 오버헤드와 메모리 소비가 적기 때문에 항상 기록됩니다. 데이터가 오랜 시간 동안 기록되면, 오래된 데이터 포인트는 통합되어 메모리 소비가 시간에 따라 선형적으로 증가하지 않도록 합니다.
각 클래스의 인스턴스 수와 같은 매개변수가 있는 텔레메트리도 있습니다. 추가 차원은 영구적인 연대기적 기록을 지속 불가능하게 만듭니다. JProfiler에게 선택한 여러 클래스의 인스턴스 수에 대한 텔레메트리를 기록하도록 지시할 수 있지만, 모든 클래스에 대해서는 기록하지 않습니다.
이전 예를 계속해서, JProfiler는 모든 클래스의 인스턴스 수를 보여줄 수 있지만, 연대기적 정보는 없습니다. 이것이 "모든 객체" 뷰이며, 각 클래스를 테이블의 행으로 보여줍니다. 뷰 업데이트 빈도는 초당 한 번보다 낮으며, 측정이 얼마나 많은 오버헤드를 초래하는지에 따라 자동으로 조정될 수 있습니다. 모든 클래스의 인스턴스 수를 결정하는 것은 상대적으로 비용이 많이 들며, 힙에 객체가 많을수록 더 오래 걸립니다. 이 때문에 "모든 객체"는 자동으로 업데이트되지 않으며, 모든 객체의 새로운 덤프를 수동으로 생성해야 합니다.
일부 측정은 스레드가 현재 있는 실행 상태와 같은 열거형 값을 캡처합니다. 이러한 종류의 측정은 색상화된 타임라인으로 표시될 수 있으며, 수치 텔레메트리보다 메모리를 훨씬 적게 소비합니다. 스레드 상태의 경우, "스레드 히스토리" 뷰는 JVM의 모든 스레드에 대한 타임라인을 보여줍니다. 수치 값이 있는 텔레메트리와 마찬가지로, 오래된 값은 통합되어 메모리 소비를 줄이기 위해 더 거칠게 만들어집니다.
할당 기록
특정 시간 간격 동안 할당된 인스턴스 수에 관심이 있다면, JProfiler는 모든 할당을 추적해야 합니다. JProfiler가 힙의 모든 객체를 반복하여 필요할 때 정보를 얻을 수 있는 "모든 객체" 뷰와 달리, 단일 할당을 추적하려면 각 객체 할당에 대해 추가 코드가 실행되어야 합니다. 이는 매우 비용이 많이 드는 측정으로, 많은 객체를 할당할 경우 프로파일된 애플리케이션의 런타임 특성, 특히 성능 핫스팟을 크게 변경할 수 있습니다. 이 때문에 할당 기록은 명시적으로 시작하고 중지해야 합니다.
관련된 녹화가 있는 뷰는 처음에 녹화 버튼이 있는 빈 페이지를 보여줍니다. 동일한 녹화 버튼은 도구 모음에서도 찾을 수 있습니다.
할당 기록은 할당된 인스턴스 수뿐만 아니라 할당 스택 트레이스도 기록합니다. 메모리에 할당된 각 녹화의 스택 트레이스를 유지하면 과도한 오버헤드를 생성하므로, JProfiler는 기록된 스택 트레이스를 트리로 누적합니다. 이렇게 하면 데이터를 훨씬 쉽게 해석할 수 있는 장점이 있습니다. 그러나 연대기적 측면은 사라지고 특정 시간 범위를 데이터에서 추출할 수 있는 방법은 없습니다.
메모리 분석
할당 기록은 객체가 할당된 위치만 측정할 수 있으며, 객체 간의 참조에 대한 정보는 없습니다. 메모리 누수 해결과 같은 참조가 필요한 모든 메모리 분석은 힙 워커에서 수행됩니다. 힙 워커는 전체 힙의 스냅샷을 찍고 분석합니다. 이는 JVM을 일시 중지시키는 침습적인 작업으로, 잠재적으로 오랜 시간이 걸리며 많은 메모리가 필요합니다.
더 가벼운 작업은 사용 사례를 시작하기 전에 힙의 모든 객체를 표시하여 나중에 힙 스냅샷을 찍을 때 새로 할당된 모든 객체를 찾을 수 있도록 하는 것입니다.
JVM에는 전체 힙을 파일로 덤프하는 특별한 트리거가 있으며, 이는 오래된 HPROF 프로파일링 에이전트의 이름을 따서 명명되었습니다. 이는 프로파일링 인터페이스와 관련이 없으며, 그 제약 하에 작동하지 않습니다. 이 때문에 HPROF 힙 덤프는 더 빠르고 적은 리소스를 사용합니다. 단점은 힙 워커에서 힙 스냅샷을 볼 때 JVM과의 실시간 연결이 없으며 일부 기능을 사용할 수 없다는 것입니다.
메서드 호출 기록
메서드 호출이 얼마나 오래 걸리는지를 측정하는 것은 할당 기록과 마찬가지로 선택적 녹화입니다. 메서드 호출은 트리에 누적되며, 호출 그래프와 같은 다양한 관점에서 기록된 데이터를 보여주는 다양한 뷰가 있습니다. 이 유형의 데이터에 대한 녹화는 JProfiler에서 "CPU 녹화"라고 합니다.
특정 상황에서는 특히 여러 스레드가 관련된 경우 메서드 호출의 연대기적 순서를 보는 것이 유용할 수 있습니다. 이러한 특별한 경우를 위해 JProfiler는 "콜 트레이서" 뷰를 제공합니다. 해당 뷰는 더 일반적인 CPU 녹화와 연결되지 않은 별도의 녹화 유형을 가지고 있습니다. 콜 트레이서는 성능 문제를 해결하는 데 유용할 만큼 많은 데이터를 생성하지 않으며, 이는 전문화된 디버깅 형태에만 사용됩니다.
콜 트레이서는 CPU 녹화에 의존하며, 필요할 경우 자동으로 이를 켭니다.
자체 녹화를 가진 또 다른 전문화된 뷰는 "복잡도 분석"입니다. 이는 선택된 메서드의 실행 시간만 측정하며, CPU 녹화가 활성화될 필요는 없습니다. 추가 데이터 축은 스크립트를 사용하여 계산할 수 있는 메서드 호출의 알고리즘 복잡성에 대한 수치 값입니다. 이렇게 하면 메서드의 실행 시간이 매개변수에 어떻게 의존하는지를 측정할 수 있습니다.
모니터 기록
스레드가 대기하거나 차단되는 이유를 분석하려면 해당 이벤트를 기록해야 합니다. 이러한 이벤트의 비율은 크게 다릅니다. 스레드가 자주 작업을 조정하거나 공통 자원을 공유하는 멀티스레드 프로그램의 경우, 이러한 이벤트가 엄청나게 많을 수 있습니다. 이 때문에 이러한 연대기적 데이터는 기본적으로 기록되지 않습니다.
모니터 기록을 켜면 "잠금 히스토리 그래프"와 "모니터 히스토리" 뷰가 데이터를 보여주기 시작합니다.
잡음을 제거하고 메모리 소비를 줄이기 위해 매우 짧은 이벤트는 기록되지 않습니다. 뷰 설정에서 이러한 임계값을 조정할 수 있습니다.
프로브 기록
프로브는 JDBC 호출이나 파일 작업과 같은 JVM의 상위 수준 하위 시스템을 보여줍니다. 기본적으로 프로브는 기록되지 않으며, 각 프로브에 대해 별도로 기록을 전환할 수 있습니다. 일부 프로브는 매우 적은 오버헤드를 추가하거나 전혀 추가하지 않으며, 일부는 애플리케이션이 수행하는 작업과 프로브가 구성된 방식에 따라 상당한 양의 데이터를 생성할 수 있습니다.
할당 기록 및 메서드 호출 기록과 마찬가지로 프로브 데이터는 누적되며, 타임라인 및 텔레메트리를 제외하고는 연대기적 정보가 폐기됩니다. 그러나 대부분의 프로브에는 단일 이벤트를 검사할 수 있는 "이벤트" 뷰가 있으며, 이는 잠재적으로 큰 오버헤드를 추가하고 별도의 녹화 작업을 가지고 있습니다. 해당 녹화 작업의 상태는 지속되므로, 프로브 기록을 전환할 때 이전에 켰던 경우 관련 이벤트 기록도 함께 전환됩니다.
JDBC 프로브에는 JDBC 연결 누수를 기록하기 위한 세 번째 녹화 작업이 있습니다. 연결 누수를 찾는 것과 관련된 오버헤드는 실제로 그러한 문제를 조사하려고 할 때만 발생합니다. 이벤트 기록 작업과 마찬가지로 누수 기록 작업의 선택 상태는 지속됩니다.
녹화 프로파일
많은 상황에서 단일 클릭으로 다양한 녹화를 시작하거나 중지하고 싶을 것입니다. 모든 관련 뷰를 방문하고 녹화 버튼을 하나씩 전환하는 것은 비실용적일 것입니다. 이러한 이유로 JProfiler에는 녹화 프로파일이 있습니다. 도구 모음에서 녹화 시작 버튼을 클릭하여 녹화 프로파일을 생성할 수 있습니다.
녹화 프로파일은 원자적으로 활성화할 수 있는 특정 녹화 조합을 정의합니다. JProfiler는 선택한 녹화로 인해 생성되는 오버헤드에 대한 대략적인 인상을 주려고 하며, 문제 있는 조합을 피하도록 합니다. 특히, 할당 기록과 CPU 기록은 잘 맞지 않으며, 할당 기록은 CPU 데이터의 타이밍을 크게 왜곡할 것입니다.
세션이 실행 중일 때 언제든지 녹화 프로파일을 활성화할 수 있습니다. 녹화 프로파일은 추가적이지 않으며, 녹화 프로파일에 포함되지 않은 모든 녹화를 중지합니다. 녹화 중지 버튼을 사용하여 어떻게 활성화되었든 모든 녹화를 중지할 수 있습니다. 현재 활성화된 녹화를 확인하려면 상태 표시줄의 녹화 레이블 위로 마우스를 가져가십시오.
녹화 프로파일은 프로파일링을 시작할 때 직접 활성화할 수도 있습니다. "세션 시작" 대화 상자에는 초기 녹화 프로파일 드롭다운이 있습니다. 기본적으로 녹화 프로파일이 선택되지 않지만, JVM의 시작 단계에서 데이터를 필요로 하는 경우 필요한 녹화를 구성할 수 있는 곳입니다.
트리거를 사용한 녹화
때때로 특정 조건이 발생할 때 녹화를 시작하고 싶을 수 있습니다. JProfiler에는 작업 목록을 실행하는 트리거를 정의하는 시스템이 있습니다. 사용 가능한 트리거 작업에는 활성 녹화의 변경도 포함됩니다.
예를 들어, 특정 메서드가 실행될 때만 녹화를 시작하고 싶을 수 있습니다. 그런 경우, 세션 설정 대화 상자로 이동하여 트리거 설정 탭을 활성화하고 해당 메서드에 대한 메서드 트리거를 정의합니다. 작업 구성에서는 다양한 녹화 작업을 사용할 수 있습니다.
"녹화 시작" 작업은 매개변수 없이 해당 녹화를 제어합니다. 일반적으로 녹화를 중지하고 다시 시작할 때, 이전에 기록된 모든 데이터는 지워집니다. "CPU 데이터" 및 "할당 데이터" 녹화의 경우, 이전 데이터를 유지하고 여러 간격에 걸쳐 누적을 계속할 수 있는 옵션도 있습니다.
메서드 트리거는 호출 트리에서 "메서드 트리거 추가" 작업을 사용하여 편리하게 추가할 수 있습니다. 동일한 세션에 이미 메서드 트리거가 있는 경우, 기존 트리거에 메서드 인터셉션을 추가할 수 있습니다.
기본적으로, 트리거는 프로파일링을 위해 JVM이 시작될 때 활성화됩니다. 시작 시 트리거를 비활성화하는 방법은 두 가지가 있습니다: 트리거 구성에서 개별적으로 비활성화하거나 세션 시작 대화 상자의
시작 시 트리거 활성화 확인란을 선택 해제합니다. 라이브 세션 중에는 메뉴에서 프로파일링→(활성화|비활성화) 트리거를 선택하거나 상태
표시줄의
때때로, 동일한 그룹의 트리거에 대한 활성화를 동시에 전환해야 할 필요가 있습니다. 이는 관심 있는 트리거에 동일한 그룹 ID를 할당하고 메뉴에서 프로파일링→트리거 그룹 활성화를 호출하여 가능합니다.
jpcontroller를 사용한 녹화
JProfiler에는 이미 프로파일링 중인 JVM의 녹화를 제어하기 위한 명령줄 실행 파일이 있습니다. 는 JProfiler MBean이
게시되어야 하며, 그렇지 않으면 프로파일된 JVM에 연결할 수 없습니다. 이는 프로파일링 에이전트가 이미 프로파일링 설정을 받은 경우에만 해당됩니다. 프로파일링 설정이 없으면 에이전트는 정확히 무엇을
기록해야 하는지 알 수 없습니다.
jpcontroller
다음 조건 중 하나가 적용되어야 합니다:
- JProfiler GUI로 이미 JVM에 연결했습니다
-
프로파일된 JVM이
-agentpath
VM 매개변수와 함께 시작되었으며,nowait
및config
매개변수를 포함했습니다. 통합 마법사에서는 즉시 시작 모드와 시작 시 구성 적용 옵션에 해당합니다. -
실행 파일로 프로파일링을 위해 JVM이 준비되었으며, jpenable
-offline
매개변수가 지정되었습니다. 자세한 내용은의 출력을 참조하십시오. jpenable -help
특히, 프로파일된 JVM이 nowait
플래그로만 시작된 경우 는 작동하지 않습니다. 통합 마법사에서는
JProfiler GUI로 연결할 때 구성 적용 옵션이 구성 동기화 단계에서 이러한 매개변수를 구성합니다. 자세한 내용은 jpcontroller시작 시 프로파일링 설정 설정에 대한 도움말 주제를
참조하십시오.
jpcontroller는 모든 녹화 및 해당 매개변수에 대한 반복적인 다단계 메뉴를 제공합니다. 이를 사용하여 스냅샷을 저장할 수도 있습니다.
프로그램 방식으로 녹화 시작
녹화를 시작하는 또 다른 방법은 API를 통해서입니다. 프로파일된 VM에서 com.jprofiler.api.controller.Controller
클래스를 호출하여 프로그램
방식으로 녹화를 시작하고 중지할 수 있습니다. 자세한 내용과 컨트롤러 클래스를 포함하는 아티팩트를 얻는 방법은 오프라인 프로파일링에 대한 장을
참조하십시오.
다른 JVM에서 녹화를 제어하려면 에서도 사용되는 프로파일된 JVM의 동일한 MBean에 액세스할 수 있습니다. MBean의 프로그램
방식 사용을 설정하는 것은 다소 복잡하며 상당한 절차가 필요하므로, JProfiler는 재사용할 수 있는 예제를 제공합니다. 파일
jpcontroller
api/samples/mbean/src/MBeanProgrammaticAccessExample.java
를 확인하십시오. 이는 다른 프로파일된 JVM에서 5초 동안 CPU 데이터를
기록하고 디스크에 스냅샷을 저장합니다.