반응형
Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- I'm Sorry
- 네트워크보안
- 머신러닝
- 네트워크
- 디자인패턴
- 웹개발
- 컴퓨터공학
- 알고리즘
- 파이썬
- 데이터구조
- Yes
- 소프트웨어공학
- 프로그래밍언어
- 딥러닝
- 프로그래밍
- 소프트웨어
- 자료구조
- 클라우드컴퓨팅
- 데이터분석
- springboot
- 사이버보안
- 데이터과학
- 보안
- 버전관리
- 컴퓨터비전
- 인공지능
- 자바스크립트
- 컴퓨터과학
- 빅데이터
- 데이터베이스
Archives
- Today
- Total
스택큐힙리스트
JVM GC 종류 완전 정리 + 실전 튜닝 가이드 본문
반응형
Java 애플리케이션이 점점 커지다 보면 성능 병목의 핵심 원인 중 하나가 GC(Garbage Collection)이라는 걸 알게 됩니다. GC가 뭔지, 어떤 종류가 있는지, 그리고 어떻게 튜닝해야 서버가 멈추지 않고 안정적으로 돌아갈 수 있는지 고민되시죠?
이번 포스팅에서는 JVM의 주요 GC 종류를 비교하고, 실무에서 바로 써먹을 수 있는 GC 튜닝 방법까지 한 번에 정리해드립니다.
✅ 1. GC(Garbage Collection)란?
GC는 더 이상 사용되지 않는 객체를 힙 메모리에서 제거하는 작업입니다. 메모리 누수를 방지하고, 애플리케이션이 장시간 안정적으로 동작할 수 있도록 도와주는 핵심 기능이죠.
하지만 GC는 공짜가 아닙니다. 실행되는 동안 애플리케이션의 모든 스레드가 일시정지되는 Stop-the-World(STW) 현상이 발생할 수 있습니다. 이 시간을 최소화하는 것이 GC 튜닝의 핵심입니다.
✅ 2. 주요 GC 종류 비교
🔹 ① Serial GC (-XX:+UseSerialGC)
- 싱글 스레드 기반
- 단순하지만 느림
- STW 시간 김
- 클라이언트 애플리케이션이나 리소스가 매우 적은 환경에 적합
🔹 ② Parallel GC (-XX:+UseParallelGC)
- 멀티 스레드로 GC 수행
- Throughput(처리량) 중심
- 기본 GC (Java 8 기준)
- STW는 존재하지만 상대적으로 빠름
- 서버 애플리케이션에 많이 사용됨
🔹 ③ CMS GC (-XX:+UseConcMarkSweepGC)
- STW 시간을 줄이기 위해 동시 마크/스윕 수행
- 대부분 백그라운드에서 실행
- 단점: 프래그멘테이션 발생 가능
- Java 9부터 Deprecated → Java 14에서 완전 제거
🔹 ④ G1 GC (-XX:+UseG1GC)
- Java 9 이후의 기본 GC
- Region 단위로 메모리 분할
- GC 시간이 예측 가능하고 짧음
- Full GC도 STW지만 상대적으로 효율적
- 실무에서 가장 많이 쓰이는 GC
🔹 ⑤ ZGC (-XX:+UseZGC) / Shenandoah
- 초저지연(ultra low pause) GC
- 대부분 작업을 애플리케이션과 동시 수행
- STW는 몇 밀리초 수준
- Java 11~17 이상에서 사용 가능
- 대용량 처리 시스템, 실시간 서비스에 적합
✅ 3. 실전 GC 튜닝 가이드
GC 튜닝은 "서버 사양"과 "애플리케이션의 성격"에 따라 다르지만, 기본적으로 아래 순서로 접근하면 됩니다.
🔹 ① JVM 힙 크기 설정
-Xms2G -Xmx2G
- -Xms: 초기 힙 사이즈
- -Xmx: 최대 힙 사이즈
- 두 값을 같게 설정하면 메모리 확장/축소로 인한 부하를 줄일 수 있음
🔹 ② GC 종류 선택
-XX:+UseG1GC
- G1GC를 기본으로 사용하고, 고성능이 필요하면 ZGC, Shenandoah 고려
🔹 ③ GC 로그 설정 (필수!)
-Xlog:gc*:file=gc.log:time,uptime,level,tags
- GC 로그는 분석 도구(GCEasy, GCViewer 등)와 함께 사용
- Full GC 빈도와 STW 시간을 파악 가능
🔹 ④ G1GC 튜닝 예시
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
- 목표 GC 중단 시간 설정
- 힙의 몇 % 찼을 때 GC 시작할지 지정
🔹 ⑤ 실무 팁
- GC 튜닝보다 먼저 불필요한 객체 생성을 줄이는 코드 리팩토링이 우선
- 서버 재기동 없이 GC 튜닝을 적용하려면 Docker나 Kubernetes 환경에서 JVM 옵션 관리에 유의
- JVisualVM, JFR, jstat, jmap 등을 활용한 힙 상태 분석도 병행 추천
✅ 4. 언제 어떤 GC를 써야 할까?
상황 | 추천 GC |
리소스 적은 시스템 | SerialGC |
고성능 일반 서버 | G1GC |
초고속 실시간 응답 필요 | ZGC 또는 Shenandoah |
Java 8 기반 레거시 시스템 | ParallelGC 또는 CMS (단 CMS는 비추천) |
반응형
'개발' 카테고리의 다른 글
실전 튜닝 Q&A: 요청 지연 파악부터 CDN-비용, 인덱스 설계까지 한 방에! (0) | 2025.07.11 |
---|---|
Redis로 읽기 부하 줄이기 – 캐시 전략 실전 가이드 (4) | 2025.07.11 |
Record vs Lombok vs AutoValue 비교 분석 (1) | 2025.07.11 |
자바 스프링 개발 시작하기 - 5일차 모던 Java 스킬업 (2) | 2025.07.11 |
Java GC와 Stop-the-World 완전 정리 – 성능 병목의 실체 (0) | 2025.07.10 |
Comments