본문 바로가기
Java

JAVA GC에 대해 빠르고 쉽게 키워드로 살펴보기

by Aole 2025. 1. 24.

 

📌 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가 불필요한 객체를 제거하는 기본적인 방법이에요.

  1. Mark 단계: 살아있는 객체(Reachable)를 표시
  2. Sweep 단계: 표시되지 않은 객체(Unreachable) 제거
  3. 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 애플리케이션을 만들어 보자! 💪

 

 

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC

 

☕ 가비지 컬렉션 동작 원리 & GC 종류 💯 총정리

Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객

inpa.tistory.com

 

위의 블로그를 참고하여 정리한 내용입니다 :)

'Java' 카테고리의 다른 글

자바의 변수 초기화 순서 (1분 안에 정리하기)  (0) 2025.01.24
자바 실행과정 쉽게 파헤치기  (2) 2025.01.23