Java Garbage Collector(GC) 원리 완벽 이해하기
Java를 공부하다 보면 반드시 만나게 되는 핵심 개념이 바로:
Garbage Collector(GC)
입니다.
실무에서도:
- 서버 멈춤 현상
- 메모리 부족
- 응답 지연
- CPU 급등
- OutOfMemoryError
까지 대부분 GC와 연결됩니다.
초보 시절에는 보통:
안 쓰는 객체 지워주는 기능
정도로만 이해하기 쉽습니다.
하지만 실제 GC는:
- JVM 성능
- Heap 구조
- 객체 생명주기
- 애플리케이션 응답속도
- 대규모 서버 운영
전체와 깊게 연결되는 매우 복잡한 시스템입니다.
이번 글에서는:
- GC가 왜 필요한가
- GC 동작 원리
- Mark & Sweep
- Minor GC / Full GC
- Stop-The-World
- G1GC / ZGC
까지 JVM 내부 관점으로 깊게 정리해보겠습니다.
1. GC(Garbage Collector)란?
Garbage Collection 은:
사용하지 않는 객체 메모리를 자동으로 회수하는 시스템
입니다.
즉:
참조 없는 객체 탐색
↓
Heap 메모리 제거
수행.
2. 왜 GC가 필요할까?
C/C++ 같은 언어는:
malloc()
free()
직접 메모리 해제 필요.
문제:
- 메모리 누수
- 이중 해제
- 잘못된 포인터 접근
발생 가능.
3. Java는 자동 메모리 관리
Java는:
객체 생성은 개발자
메모리 해제는 GC
구조.
즉:
new User();
까지만 개발자가 하고,
삭제는 JVM이 자동 처리.
4. GC 대상은 어디인가?
GC는:
Heap 영역
만 관리합니다.
즉:
- 객체
- 배열
- String 객체
등 Heap 대상.
5. Stack은 GC 대상이 아니다
Stack은:
메서드 종료 시 자동 제거
됩니다.
즉 GC 불필요.
6. GC 대상 조건
핵심 기준:
“도달 가능(Reachable)한가?”
입니다.
7. Reachable 객체
예시:
User user = new User();
현재:
Stack → Heap 객체 참조 존재
즉:
Reachable
상태.
8. Unreachable 객체
user = null;
이제:
참조 없음
즉:
GC 대상 가능
상태.
9. GC 핵심 원리
GC는 기본적으로:
사용 중인 객체 찾기
↓
안 쓰는 객체 제거
과정 수행.
10. 가장 기본 알고리즘: Mark & Sweep
GC 핵심 알고리즘.
구조:
1. Mark
2. Sweep
11. Mark 단계
GC Root부터 시작.
예:
- Stack 변수
- static 변수
- JNI 참조
등.
그리고:
참조 가능한 객체 표시(mark)
수행.
12. Sweep 단계
Mark되지 않은 객체:
사용 안 하는 객체
판단 후 제거.
13. 메모리 단편화(Fragmentation)
문제 발생 가능.
예:
[객체][빈칸][객체][빈칸]
메모리 조각화.
14. 그래서 Compact 수행
Compact는:
객체 압축 정렬
입니다.
즉:
[객체][객체][빈공간]
형태로 정리.
15. Heap 구조
Java Heap은 보통:
Young Generation
Old Generation
으로 나뉩니다.
16. 왜 세대 분리할까?
Java 객체 특징:
대부분 빨리 죽음
입니다.
즉:
- 잠깐 생성
- 금방 GC 대상
객체 매우 많음.
17. Young Generation
새 객체 대부분 생성되는 영역.
구조:
Eden
Survivor 0
Survivor 1
18. Eden 영역
새 객체 생성 위치.
예:
new Object()
대부분 Eden 생성.
19. Minor GC
Eden 꽉 차면:
Minor GC
발생.
즉:
- 살아있는 객체만 Survivor 이동
- 죽은 객체 제거
수행.
20. Survivor 영역
살아남은 객체 임시 저장.
GC 반복 후 오래 살아남으면:
Old Generation 이동
합니다.
21. Old Generation
오래 살아남은 객체 저장.
예:
- Spring Singleton Bean
- Cache 객체
- 장기 유지 데이터
22. Full GC
Old 영역 부족 시:
Full GC
발생.
이건 매우 무겁습니다.
23. Stop-The-World(STW)
매우 중요합니다.
GC 수행 중 JVM은 보통:
애플리케이션 실행 잠시 중단
합니다.
이를:
Stop-The-World
라고 함.
24. 왜 서버가 멈춘 것처럼 보일까?
Full GC 길어지면:
모든 요청 대기
가능.
즉:
- API 응답 지연
- 서버 멈춤 현상
발생 가능.
25. Minor GC는 비교적 빠름
Young 영역은 작고:
대부분 객체 금방 죽음
즉 처리 빠름.
26. Full GC는 위험
Old 영역 객체는:
- 많고
- 크고
- 오래 살아있음
즉:
탐색 비용 큼
27. 그래서 GC 튜닝 중요
실무에서는:
- Heap 크기
- GC 알고리즘
- 객체 생성 패턴
매우 중요.
28. 대표 GC 종류
| GC | 특징 |
| Serial GC | 단일 스레드 |
| Parallel GC | Throughput 중심 |
| CMS | 저지연 시도 |
| G1GC | 현대 기본 GC |
| ZGC | 초저지연 GC |
29. G1GC란?
Garbage-First Garbage Collector 는:
Heap을 Region 단위로 관리하는 GC
입니다.
30. G1GC 특징
장점:
- Pause Time 감소
- 예측 가능한 GC
- 대용량 Heap 대응
현재 Java 기본 GC.
31. ZGC란?
Z Garbage Collector 는:
초저지연(Low Latency) GC
입니다.
특징:
Stop-The-World 최소화
목표.
32. ZGC 특징
- TB급 Heap 지원
- 매우 짧은 Pause
- 대규모 서버용
33. GC 로그 중요성
실무에서는 GC 로그 매우 중요.
대표 옵션:
-Xlog:gc
설명:
| 옵션 | 의미 |
| -Xlog:gc | GC 로그 출력 |
34. Heap 옵션
대표 옵션:
-Xms1g -Xmx4g
설명:
| 옵션 | 의미 |
| -Xms | 초기 Heap |
| -Xmx | 최대 Heap |
35. 왜 객체 생성 최소화가 중요할까?
객체 많아지면:
GC 대상 증가
↓
GC 빈도 증가
↓
성능 저하
가능.
36. StringBuilder가 중요한 이유
str += value;
반복 시 String 객체 폭증.
즉 GC 부담 증가.
그래서:
StringBuilder
사용.
37. 메모리 누수(Memory Leak)
Java도 메모리 누수 가능.
대표 사례:
참조 계속 유지
예:
- static Collection
- ThreadLocal
- Cache
38. OutOfMemoryError 원인
대표 사례:
객체 계속 살아있음
↓
Heap 부족
39. 실무에서 자주 하는 실수
1) GC를 “자동 최적화 시스템”으로 착각
GC도 비용 큼.
2) 객체 생성 비용 무시
대량 생성 시 GC 과부하 가능.
3) Full GC 방치
실서비스 장애 원인 가능.
40. 핵심 흐름 요약
객체 생성
↓
Young Generation 저장
↓
Minor GC
↓
오래 생존 시 Old 이동
↓
Full GC
↓
메모리 회수
41. 가장 중요한 핵심 한 줄
GC는 Heap 메모리를 자동 관리하지만
공짜 성능은 아니다
입니다.
42. 정리
Garbage Collector(GC)는 단순 메모리 삭제 기능이 아닙니다.
실제로는:
- JVM 성능
- Heap 구조
- 객체 생명주기
- 서버 응답속도
- 대규모 시스템 안정성
과 깊게 연결되는 JVM 핵심 시스템입니다.
특히 실무에서는:
- Minor GC / Full GC
- Stop-The-World
- G1GC / ZGC
- 객체 생성 비용
- 메모리 누수
를 정확히 이해하는 것이 매우 중요합니다.
다음 글에서는:
GC 종류와 특징(G1GC, ZGC 등)
을 CMS, Parallel GC, Region 구조, Low Latency GC 전략까지 포함해서 깊게 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java OutOfMemoryError(OOM) 원인 분석 완벽 이해하기 (0) | 2026.05.26 |
|---|---|
| Java GC 종류와 특징(G1GC, ZGC 등) 완벽 이해하기 (0) | 2026.05.26 |
| Java String Pool 원리 완벽 이해하기 (0) | 2026.05.26 |
| Java 참조 타입(Reference Type)과 객체 참조 완벽 이해하기 (0) | 2026.05.26 |
| Java 객체 생성 과정과 메모리 흐름 완벽 이해하기 (0) | 2026.05.26 |
댓글