사실 운영 중인 서비스에서 갑자기 CPU 점유율이 치솟거나 메모리 누수가 의심될 때, 어디서부터 손을 대야 할지 막막한 경우가 참 많으시죠? 저도 연차가 쌓이면서 수많은 모니터링 툴을 써봤지만, 결국 가장 신뢰하게 되는 건 JDK에 내장된 Java Flight Recorder(JFR)더라고요.
로그를 일일이 뒤지는 노가다에서 벗어나고 싶은 분들을 위해, 17년 차 개발자로서 제가 직접 겪은 삽질의 기록과 이를 통해 얻은 생산성 폭발 팁을 정리해 보았습니다. 이 글을 다 읽고 나면 아마 성능 분석에 대한 두려움이 절반 이상은 사라지실 겁니다.
갑자기 서버가 멈췄을 때 우리는 왜 당황할까?
분명 로컬 테스트에서는 문제가 없었는데, 실서버에 배포만 하면 며칠 뒤에 응답 속도가 느려지는 상황은 개발자에게는 공포 그 자체입니다. 보통은 APM을 보거나 힙 덤프를 떠서 분석하려 하지만, 힙 덤프는 용량이 너무 커서 서버에 부하를 주거나 분석하는 데만 수 시간이 걸리기도 합니다.
이럴 때 JFR은 마치 비행기의 블랙박스처럼 작동합니다. 오버헤드가 거의 없어서(보통 1% 미만) 운영 환경에서도 마음 놓고 켤 수 있다는 게 가장 큰 매력이죠. 제가 예전에 메모리 릭으로 고생할 때, 힙 덤프를 뜨다가 서버가 뻗어버린 적이 있는데 그때 JFR을 미리 설정해뒀더라면 그런 대참사는 막을 수 있었을 겁니다.
Java Flight Recorder는 유료인가요? 최신 정책이 궁금해요.
가장 많이들 물어보시는 부분입니다. 2026년 현재 기준으로 말씀드리면, OpenJDK를 사용하신다면 JFR은 완전히 무료입니다. 과거 Oracle JDK 8 시절에는 상용 옵션이라 라이선스 비용이 발생했지만, 이제는 누구나 자유롭게 사용할 수 있는 오픈소스 기술이 되었습니다. 다만 상용 Oracle JDK를 특정 버전 이상에서 사용하실 때는 여전히 라이선스 범위를 확인하셔야 하지만, 대부분의 실무 환경인 OpenJDK 11, 17, 21 이상에서는 아무런 제약 없이 생산성을 높이는 도구로 활용 가능합니다.

성능 분석의 패러다임을 바꾸는 JFR 실전 활용 5단계
이 과정은 제가 실제로 성능 이슈를 해결할 때 사용하는 루틴입니다. 복잡한 이론보다는 '지금 당장 적용 가능한' 순서로 구성해 봤습니다.
1. 블랙박스 가동하기: JFR 레코딩 시작
서버 실행 시점에 JVM 옵션을 넣는 게 가장 정석이지만, 이미 돌아가고 있는 서버라면 jcmd 명령어를 사용하세요. 저는 개인적으로 문제가 터지기 전부터 '최근 1시간 분량'을 계속 순환해서 저장하도록 설정해둡니다. 이렇게 하면 이슈가 터진 직후에 파일을 뽑아낼 수 있거든요.
2. 데이터 추출과 JMC(Java Mission Control) 실행
저장된 .jfr 파일을 내 컴퓨터로 가져온 뒤 JMC라는 시각화 툴로 엽니다. 여기서부터가 진짜 재미있는 구간입니다. 마치 엑스레이를 찍듯 JVM 내부 상황이 그래프로 펼쳐지는데, 여기서 가장 먼저 봐야 할 건 '이벤트 브라우저'가 아니라 '자동 분석 보고서'입니다.
3. 스레드 정체 구간 찾기 (Lock & Wait)
직접 경험해 보니, CPU 문제보다 더 골치 아픈 게 스레드 경합이더라고요. JFR은 어떤 메서드가 어떤 Lock을 잡고 몇 밀리초(ms) 동안 대기했는지 정확히 짚어줍니다. 이건 직접 해보면 차이가 꽤 납니다. 감으로 코드를 고칠 때와 데이터를 보고 '아, 여기서 DB 커넥션 풀이 부족했구나'라고 깨닫는 건 하늘과 땅 차이니까요.
4. 메모리 할당 패턴 분석
메모리 누수뿐만 아니라, 불필요하게 객체를 너무 많이 생성하는 코드를 잡아내는 데 탁월합니다. TLAB(Thread Local Allocation Buffer) 밖에서 할당되는 큰 객체들을 추적하다 보면, 의외로 엉뚱한 라이브러리에서 부하가 생기는 걸 발견할 수 있습니다.
5. 가비지 컬렉션(GC) 튜닝
GC가 언제 일어났고, 일어날 때마다 중단 시간(Pause Time)이 얼마나 되었는지 시각적으로 확인하세요. 2026년 최신 서버 환경에서는 대부분 G1GC나 ZGC를 쓰실 텐데, JFR 데이터를 기반으로 힙 사이즈를 512MB만 조절해도 응답 속도가 20% 이상 개선되는 경험을 하실 수 있습니다.
실무에서 바로 써먹는 JFR 활용 비교표
성능 분석 도구가 많다 보니 어떤 걸 써야 할지 고민되시죠? 제가 주로 사용하는 도구들을 상황별로 비교해 봤습니다.
| 분석 도구 | 주요 장점 | 단점 및 한계 | 추천 상황 |
| VisualVM | 실시간 직관성 우수 | 운영 서버 부하 높음 | 로컬 개발 및 디버깅 |
| JFR & JMC | 극히 낮은 오버헤드 | 실시간 확인은 어려움 | 운영 환경 상시 모니터링 |
| Heap Dump | 모든 객체 전수 조사 | 덤프 생성 시 서버 멈춤 | 심각한 메모리 누수 분석 |
표를 보면 알 수 있듯이, 서비스 운영에 지장을 주지 않으면서 심층 분석이 가능한 도구는 JFR이 유일합니다. 특히 대규모 트래픽이 몰리는 서비스라면 선택이 아닌 필수라고 봐요.
직접 경험하며 깨달은 주의사항과 팁
솔직히 말씀드리면, JFR이 만능은 아닙니다. 처음 사용하시는 분들이 자주 하는 실수가 '모든 이벤트'를 다 수집하려고 하는 건데, 이렇게 하면 오버헤드가 5% 이상으로 튀어서 운영 서버에 무리가 갈 수 있습니다. 프로파일(Profile) 설정 대신 기본(Default) 설정을 사용하세요. 기본 설정만으로도 병목 현상의 90%는 잡아낼 수 있습니다.
또한, .jfr 파일은 바이너리 형태라 용량이 작긴 하지만, 24시간 내내 풀 레코딩을 하면 디스크 용량을 꽤 잡아먹습니다. 저는 디스크 쿼터를 설정하거나, 주기적으로 오래된 파일을 삭제하는 쉘 스크립트를 함께 돌리는 방식을 추천합니다.
나에게 맞는 성능 분석 전략은?
지금 처한 상황에 따라 도구를 다르게 가져가야 생산성이 올라갑니다. 제가 추천하는 가이드는 다음과 같습니다.
- 신입~중니어 개발자: 우선 로컬에서 VisualVM으로 GC의 흐름을 눈으로 익히는 것부터 시작해 보세요.
- 운영 서버 담당자: 당장 문제가 없더라도 JVM 옵션에 JFR 상시 기록 설정을 넣어두세요. 이슈 발생 시 과거 데이터를 볼 수 있다는 것만으로도 퇴근 시간이 3시간은 빨라집니다.
- 아키텍트/시니어: JFR 데이터를 정기적으로 수집해서 서비스의 성능 히스토리를 관리하세요. 업데이트 전후의 성능 지표 비교에 이보다 정확한 자료는 없습니다.
성능 튜닝은 단순히 코드를 빠르게 만드는 과정이 아니라, 시스템이 우리에게 보내는 신호를 해석하는 과정입니다. JFR이라는 강력한 청진기를 들고 여러분의 서버가 내는 작은 비명에 귀를 기울여 보시기 바랍니다. 혹시 설정 과정에서 막히는 부분이 있다면 댓글로 남겨주세요. 제가 아는 선에서 최대한 도와드리겠습니다.
백준 골드 DP 50문제로 끝내는 동적계획법 점화식 설계 비법
백준 골드 등급의 벽을 넘지 못해 답답하셨던 분들이라면 오늘 이 글이 인생의 전환점이 될지도 모릅니다.사실 알고리즘 공부하면서 동적계획법(DP)만큼 사람 진 빠지게 하는 것도 없죠? 분명 이
byteandbit.tistory.com
'Back-end & 알고리즘' 카테고리의 다른 글
| 백준 문제 유형 파악이 안 돼서 시간 버리고 있다면? 알고리즘 분류 숨은 의도 찾는 법 (0) | 2026.04.22 |
|---|---|
| Spring Boot 초기 세팅, '현업의 맛'을 더하는 5가지 체크리스트 (0) | 2026.04.20 |
| 백준 골드 DP 50문제로 끝내는 동적계획법 점화식 설계 비법 (0) | 2026.04.18 |
| Ruby 가상 환경에서 Sidekiq과 Redis로 백그라운드 작업 처리하기, RubyMine 활용 꿀팁 (0) | 2026.04.17 |
| 뉴레릭(New Relic) Java 모니터링 유료 플랜 비용 아깝지 않게 대시보드 커스텀 설정하는 방법 (0) | 2026.04.14 |