GC란 무엇인가?
GC는 더 이상 사용되지 않는 객체를 자동으로 메모리에서 제거해주는 자바의 기능이다.
C나 C++과 달리 Java는 free(), delete 같은 메모리 해제 함수가 없다.
개발자가 객체를 만들고 나면 그 객체를 더 이상 참조하지 않는 순간 GC가 이를 감지하고 힙에서 제거한다.
덕분에 메모리 누수, 잘못된 메모리 해제 등에서 자유로운 환경을 제공한다.
자바 힙 구조와 GC 대상
자바는 객체를 Heap 영역에 저장하며, 이 영역은 다음처럼 세대별로 나뉘어 있습니다.
영역 설명
| Young Generation | 새로 생성된 객체가 저장. 대부분 여기서 생존하지 못하고 GC됨 |
| Old Generation | Young에서 살아남은 객체들이 옮겨지는 공간 |
| Metaspace | 클래스 정보 등 메타데이터 저장 (Java 8부터 PermGen → Metaspace로 변경됨) |
GC의 종류
GC 종류 특징 사용 예
| Serial GC | 단일 스레드, 작은 앱에 적합 | 테스트, 데스크탑 앱 |
| Parallel GC | 멀티스레드, Throughput 중심 | 기본값 (Java 8) |
| CMS (Deprecated) | 낮은 지연 중심, 부분 병렬 | 실시간 웹 서비스 |
| G1GC | 지연과 처리량의 균형, Java 9부터 추천 | 대부분의 서버 환경 |
| ZGC / Shenandoah | 초저지연, GC 중지 시간 <10ms | 초대용량, 실시간 처리 시스템 (Java 11+) |
GC의 단점
단점 설명
| Stop-The-World | GC 수행 시 JVM이 일시적으로 멈추는 현상 |
| 예측 어려움 | GC 발생 시점과 소요 시간은 예측 불가 |
| 튜닝 필요 | 성능 민감한 앱은 힙 크기, GC 알고리즘 설정이 매우 중요 |
JIT 컴파일러란?
자바는 바이트코드를 실행할 때 JVM이 인터프리터 방식으로 한 줄씩 해석한다.
하지만 성능 향상을 위해 자바는 JIT 컴파일러를 함께 사용한다.
JIT 컴파일러는 실행 중에 반복 호출되는 메서드(HotSpot)를 감지하고, 해당 바이트코드를 기계어로 변환한다.
JIT GC 차이
항목 JIT 컴파일러 GC
| 목적 | 실행 속도 최적화 | 메모리 확보 |
| 작동 시점 | 메서드가 자주 실행될 때 | 메모리 부족, 내부 조건 발생 시 |
| 영향 | 빠른 실행 성능 | Stop-The-World로 인한 지연 발생 |
정리
- GC는 메모리를, JIT는 실행 속도를 자동으로 관리하여 개발자가 성능/자원 걱정 없이 개발할 수 있게 해준다.
- 하지만 둘 다 언제 발생할지 정확히 예측하기 어렵고, 성능에 영향을 줄 수 있으므로 서버 환경에서는 적절한 설정과 튜닝이 필요하다.
'개발 공부 > Java' 카테고리의 다른 글
| 해시 정리 (Hash) (1) | 2025.05.29 |
|---|---|
| 자바 예외 처리 정리 - Checked, Unchecked, Error (1) | 2025.05.28 |
| [Java] JVM 메모리 구조 (0) | 2024.11.10 |
| SOLID - 객체 지향 설계의 5원칙 (0) | 2024.11.01 |
| 도서 관리 프로그램 (4) | 2022.08.18 |