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












































