Java Flight Recorder
낮은 오버헤드로 프로파일링합니다
Java Flight Recorder은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
JFR이란 무엇입니까
Java 플라이트 레코더(JFR)는 JVM에 직접 내장된 프로파일링 및 이벤트 수집 엔진입니다.
메서드 샘플, 할당, 가비지 컬렉션, 잠금, IO 등의 상세한 실행 시간 이벤트를 오버헤드가 매우 낮은 상태로 바이너리 .jfr 파일에 기록합니다. JDK와 함께 제공되므로 추가 에이전트가 필요하지 않습니다.
낮은 오버헤드가 중요한 이유
기존 계측형 프로파일러는 앱을 2배 이상 느리게 만들어 원하는 측정 결과 자체를 왜곡할 수 있습니다.
JFR은 일반적으로 오버헤드가 약 1%인 상태로 운영 환경에서 실행되도록 설계되었습니다. 따라서 실험실에서만 사용하는 것이 아니라 실제 장애가 발생했을 때 기록을 수집하도록 계속 켜 둘 수 있습니다.
애플리케이션 시작 시 기록 시작하기
애플리케이션을 시작할 때 JVM 플래그로 JFR을 활성화합니다.
-XX:StartFlightRecording=duration=60s,filename=app.jfr
이 명령은 60초 동안 이벤트를 기록한 다음 app.jfr에 기록을 저장합니다. JVM이 종료될 때까지 실행되는 기록을 시작할 수도 있습니다.
실행 중인 JVM 제어하기
실행 중인 JVM에서 명령줄 도구를 사용하여 기록을 시작하고, 중지하고, 저장할 수도 있습니다.
jcmd <pid> JFR.start name=rec settings=profilejcmd <pid> JFR.dump name=rec filename=out.jfrjcmd <pid> JFR.stop name=rec
이미 문제를 일으키고 있는 프로세스의 상태를 즉시 포착하는 데 이상적입니다.
설정: 기본 설정과 프로필 설정
JFR에는 기본 제공 구성이 두 가지 있습니다.
- 기본 설정 — 오버헤드가 최소이며 운영 환경에서 계속 사용해도 안전합니다.
- 프로필 설정 — 더 상세한 샘플링을 제공하지만 비용이 약간 더 높으며, 집중적인 조사에 적합합니다.
settings=profile로 선택합니다. 개별 이벤트를 조정하도록 사용자 정의 .jfc 구성을 작성할 수도 있습니다.
JFR이 기록하는 정보
JFR은 다음과 같은 다양한 이벤트를 수집합니다.
- 실행 샘플(CPU 시간이 사용되는 위치)
- 객체 할당 및 TLAB 활동
- 가비지 컬렉션 일시 중지
- 잠금 경합(
jdk.JavaMonitorWait) - 파일 및 소켓 IO, 스레드 대기, 예외
각 이벤트에는 시간 기록, 지속 시간, 호출 스택이 포함됩니다.
사용자 정의 이벤트
비즈니스 로직의 실행 시간을 측정하도록 자체 JFR 이벤트를 정의할 수 있습니다. jdk.jfr.Event를 확장하고, 이에 어노테이션을 적용한 다음 작업 전후에 begin() / commit()을 호출합니다.
이 부분은 JFR API 중 독립 실행에 적합한 부분입니다. 실제 기록에는 여전히 JVM 플래그가 필요하지만 이벤트 클래스는 어떤 JDK에서도 컴파일되고 실행됩니다.
import jdk.jfr.Event;
import jdk.jfr.Label;
public class Main {
@Label("Order Processing")
static class OrderEvent extends Event {
@Label("Order Id") int orderId;
}
public static void main(String[] args) {
OrderEvent e = new OrderEvent();
e.orderId = 42;
e.begin();
// ... do the work being measured ...
e.commit();
System.out.println("Custom JFR event committed for order " + e.orderId);
}
}연속 기록
장시간 실행되는 서비스에서는 크기나 보존 기간을 제한한 연속 기록(즉, 링 버퍼)을 사용합니다.
새 이벤트가 들어오면 이전 이벤트가 삭제되므로 디스크 사용량이 제한됩니다. 장애가 발생했을 때 버퍼를 저장하면 장애 직전 몇 분 동안의 데이터를 즉시 확보할 수 있습니다.
종료 시 저장하기
기록 시작 플래그에 dumponexit=true를 추가하면 JVM이 종료될 때 JFR이 버퍼를 기록합니다.
버퍼 크기를 설정하려면 -XX:FlightRecorderOptions와 함께 사용합니다. 따라서 곧 종료될 프로세스에서도 데이터를 반드시 수집할 수 있습니다.
파일 읽기
.jfr 파일은 바이너리 형식입니다. JDK 미션 컨트롤(다음 수업)에서 시각적으로 분석하거나, jdk.jfr.consumer API와 RecordingFile을 사용하여 프로그램으로 분석할 수 있습니다.
명령줄의 jfr print app.jfr를 사용하면 빠르게 검색할 수 있도록 이벤트를 텍스트로 출력할 수도 있습니다.
이벤트 실시간 스트리밍하기
JDK 14부터 JFR은 jdk.jfr.consumer.RecordingStream API를 통한 이벤트 스트리밍을 지원합니다.
파일을 저장한 뒤 나중에 여는 대신, 이벤트가 발생하는 즉시 구독하여 실시간으로 대응할 수 있습니다. 예를 들어 가비지 컬렉션 일시 중지가 임계값을 초과할 때 알림을 보낼 수 있습니다. 이를 통해 JFR은 사후 분석 도구가 아니라 실시간 모니터링 소스가 됩니다.
빠른 확인
JFR을 운영 환경에서 계속 실행해 둘 수 있는 주된 이유는 무엇입니까?
요약
JFR은 JVM에 내장된 플라이트 레코더입니다.
.jfr파일에 오버헤드가 낮고 운영 환경에서 안전한 이벤트 수집을 수행합니다.-XX:StartFlightRecording또는jcmd JFR.start로 시작합니다.- 기본 설정 또는 프로필 설정을 선택하고, 사용자 정의 이벤트를 정의할 수 있습니다.
- 연속 링 버퍼 기록과
dumponexit을 사용합니다. - 다음으로 JDK 미션 컨트롤에서 분석합니다.
자주 묻는 질문
“Java Flight Recorder” 강의는 무료인가요?
네 — “Java Flight Recorder” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Java Flight Recorder”에서 뭘 배우나요?
낮은 오버헤드로 프로파일링합니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“Java Flight Recorder” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 병목 식별
- Java Flight Recorder
- JDK Mission Control로 분석
- 자주 사용하는 JVM 튜닝 플래그