📌 Java 가비지 컬렉션(GC) 쉽게 정리해보기! 🚀
Java를 쓰다 보면 한 번쯤 들어봤을 가비지 컬렉션(GC)!
"자동으로 메모리를 정리해준다"는 건 알겠는데, 이게 정확히 어떻게 동작하는 걸까? 🤔
오늘은 GC 개념부터 동작 방식, 그리고 최적화까지 쉽게 정리해볼게요!
1. GC(Garbage Collection)란? 🗑️
✅ GC는 뭐 하는 거야?
Java에서 필요 없어진 객체를 자동으로 정리해주는 기능을 GC(Garbage Collection)라고 해요.
즉, 우리가 new로 생성한 객체 중에서 **더 이상 참조되지 않는 것들(=쓰레기)**을 주기적으로 제거하는 역할을 해요.
💡 C/C++과 다른 점?
C/C++에서는 malloc()과 free()로 직접 메모리를 관리해야 하지만,
Java에서는 GC가 알아서 처리해 주기 때문에 메모리 누수(Memory Leak) 걱정을 덜 수 있음! 🎉
2. 왜 GC가 필요할까? 🤔
아래처럼 코드를 작성했다고 해보자.
for (int i = 0; i < 10000; i++) {
NewObject obj = new NewObject();
obj.doSomething();
}
- NewObject 객체가 10,000개 생성됨
- 그런데 for 문이 끝나면? 이 객체들은 더 이상 사용되지 않음
- 그렇다면 메모리에 남아있을 필요가 없겠지?
- 여기서 GC가 등장! 🚀
GC는 이런 **더 이상 사용되지 않는 객체(Unreachable Object)**를 찾아서 자동으로 제거해줘요.
덕분에 Java는 메모리를 좀 더 효율적으로 사용할 수 있는 거죠!
3. GC의 동작 원리 🔄
1️⃣ Mark and Sweep (마크 앤 스윕) 기법
GC가 불필요한 객체를 제거하는 기본적인 방법이에요.
- Mark 단계: 살아있는 객체(Reachable)를 표시
- Sweep 단계: 표시되지 않은 객체(Unreachable) 제거
- Compact (선택적): 남은 객체들을 정리해서 메모리 단편화 방지
📝 단점: GC가 실행될 때 애플리케이션이 멈출 수도 있음. 이게 바로 Stop-The-World(STW) 문제!
4. Stop-The-World(STW) 현상 ⚠️
❗ GC가 실행될 때 애플리케이션이 멈춘다?
GC가 동작하는 동안 JVM은 모든 스레드를 멈추고(GC만 실행) 필요 없는 객체를 정리해요.
이걸 **"Stop-The-World(STW)"**라고 해요.
❌ STW 시간이 길어지면?
👉 애플리케이션이 순간적으로 멈춘 것처럼 보임
👉 특히 실시간성이 중요한 게임, 금융 서비스에서는 치명적!
5. Java의 GC 구조 (세대별 GC) 🔍
Java에서는 객체의 수명에 따라 GC를 최적화하는 방식이 있어요.
이를 **Generational GC(세대별 GC)**라고 해요.
🔹 Young Generation (YOUNG)
✔ 새로 생성된 객체가 저장되는 공간
✔ 대부분의 객체는 여기서 금방 없어짐 → Minor GC 발생
✔ Young 영역이 꽉 차면 일부 객체가 Old 영역으로 이동
🔹 Old Generation (OLD)
✔ 오래 살아남은 객체가 저장되는 공간
✔ 이곳에서 GC가 발생하면 Major GC (Full GC) 발생
✔ Full GC는 시간이 오래 걸려서 최대한 줄이는 게 핵심
📌 결론: Young GC는 자주 실행되지만 빠름, Old GC는 느리므로 최적화 필요!
6. GC의 종류 & 특징 🚀
GC 종류 특징 장점 단점
Serial GC | 싱글 스레드 GC | 단순하고 효율적 | STW 길어서 성능 저하 |
Parallel GC | 멀티 스레드 GC | 빠른 GC 수행 | CPU 사용량 증가 |
CMS GC | 애플리케이션과 동시에 실행 | STW 최소화 | 메모리 파편화 문제 |
G1 GC | 최신 GC (Java 9+ 기본) | 성능 최적화, Full GC 최소화 | 설정이 복잡 |
ZGC | 초저지연 GC | STW 10ms 이하 | Java 15+에서 사용 가능 |
📌 Java 9 이후 기본 GC는 G1 GC! 하지만 ZGC, Shenandoah 같은 최신 GC도 있음!
7. GC 튜닝 방법 🛠️
✅ GC 옵션 설정하기
java -XX:+UseG1GC -Xms2g -Xmx2g -jar MyApp.jar
✔ -XX:+UseG1GC → G1 GC 사용
✔ -Xms2g → 초기 Heap 크기 2GB
✔ -Xmx2g → 최대 Heap 크기 2GB
📌 Heap 크기 조절 & GC 선택이 중요!
8. 최신 GC 트렌드 🚀
G1 GC (Java 9 기본 GC)
✔ Region 개념 도입 → 메모리 단편화 최소화
✔ Full GC 발생 가능성을 줄여서 STW 시간 감소
ZGC (Java 15+)
✔ STW 시간이 10ms 이하로 유지
✔ 대량의 메모리(16TB) 지원
Shenandoah GC (Java 12+)
✔ GC가 실행되는 동안도 애플리케이션 실행 가능
✔ Latency(지연 시간) 최소화
9. 결론 🎯
1️⃣ GC는 불필요한 객체를 자동으로 정리하는 기능!
2️⃣ STW가 발생할 수 있으므로 성능 튜닝이 중요!
3️⃣ Young GC는 빠르고, Old GC는 느리므로 최적화 필요!
4️⃣ Java 9+에서는 기본적으로 G1 GC 사용, 최신 GC(ZGC, Shenandoah GC)도 고려!
📌 GC를 잘 이해하고 튜닝하면 Java 애플리케이션의 성능을 극대화할 수 있어요! 🚀
💡 GC 튜닝이 어렵다면?
👉 GC 로그를 분석하고 Heap 크기를 조정하는 것이 첫걸음!
👉 필요하면 -XX:+UseG1GC, -XX:+UseZGC 같은 옵션을 활용해 최적화!
🚀 GC 최적화로 더욱 빠르고 안정적인 Java 애플리케이션을 만들어 보자! 💪
☕ 가비지 컬렉션 동작 원리 & GC 종류 💯 총정리
Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객
inpa.tistory.com
위의 블로그를 참고하여 정리한 내용입니다 :)
'Java' 카테고리의 다른 글
자바의 변수 초기화 순서 (1분 안에 정리하기) (0) | 2025.01.24 |
---|---|
자바 실행과정 쉽게 파헤치기 (2) | 2025.01.23 |