GC에 대해 알아보기 이전에 해당 글은 인프런 강의를 듣고 정리한 글입니다.
강의 링크 Java와 JVM에 대해 쉽게 설명해 주는 좋은 강의라고 생각합니다. 더 자세한 내용이 궁금하신 분들은 해당 강의를 들어보는 것을 추천드립니다.


힙 영역( with GC)
- GC(Garbage Collector)가 관리하는 메모리 영역으로 Java에서 사용되는 객체의 인스턴스 및 배열이 저장되는 공간
- 세대별 컬렉션 이론을 기반으로 설계 및 운영
- Eden, Survivor
- New, Old Generation
- Metaspace
- 거의 모든 인스턴스는 힙 영역에 저장된다.
- GC가 처리해야 할 문제의 핵심 3요소
- 회수 대상 메모리를 판단하는 것
- 메모리 회수 시점
- 메모리 회수 방법
JVM Garbage Collector
- Heap 영역에서 참조되지 않는 개체를 수집 및 제거해 메모리 회수
- Minor/Major/Full GC
- GC수행시 프로그램 일시 정지
- Stop The World
- GC 속도
- Minor GC가 보통 1초 이내 완료
- Full GC는 수 초 이상 진행되기도 하며 이로 인해 데이터베이스 커넥션이 끊어지는 운영 문제가 발생할 수 있다.

세대 단위 컬렉션 이론
- 대다수 객체는 일찍 사라짐 → 약한 세대 가설
- GC과정에서 살아남은 횟수가 늘어날 수록 생존가능성이 높아짐 → 강한 세대 가설
- 다른 세대에 속한 객체간 참조는 같은 세대에 속한 객체간 참조보다 훨씬 적음 → 세대 간 참조 가설
- 핫스팟 VM에서 Eden과 Survivor 공간 비율은 보통 8:1
- 연구에 따르면 보통 첫 GC에 대략 98% 소멸
- 10% 메모리 파편화 방지를 위해 활용 (Overhead)

Young Generation

메모리가 항상 완벽하게 사용하기 힘들다. 자투리 공간이 활용되기 힘들다.
그러면 살아남은 것들만 이쁘고 깔끔하게 Survivor0 ↔ Survivor1 공간으로 옮긴다.
따라서 Eden → Survivor0 → Survivor1 → Old 식으로 옮겨 간다.
- Eden
- 객체 생성 직후 저장 되는 영역
- Minor GC 발생 시 Survivor 영역으로 이동
- Copy & Scavenge 알고리즘
- Survivor0, 1
- MinorGC 발생시 각 영역에서 살아남은 객체는 Eden → S0, S0 → S1으로 이동
- S1에서 살아남은 객체는 Old영역으로 이동
Old Generation
- 영 영역에서 소멸하지 않고 남은 개체들이 사용하는 영역
- Full GC 발생 시 개체 회수
- 참조자가 사라졌지만 식별되지 않아 남아 있는 것도 모두 회수
- 시간이 많이 걸린다.
- Mark & Compact 알고리즘
Permanent
Metaspace (java8)
- 로드되는 클래스, 메소드 등에 관한 메타 정보 저장
- Java Heap이 아닌 Native 메모리 영역 사용
- 리플렉션 클래스 로드 시 사용 (Spring)
GC 알고리즘
Mark and Sweep
- 가장 기본적인 GC알고리즘 → 후속 알고리즘의 기본 토대
- 1단계 표시(Mark, 회수대상 판단)
- 2단계 회수(Sweep, 회수)
- 단점 :
- 효율이 일정하지 않음.
- 힙이 많이 채워져 있으면 효율이 떨어짐
- 메모리 파편화에 따른 비효율 문제
Mark and copy
- Mark and sweep을 보완하기 위해 제안
- 가용 메모리 공간을 둘로 나눈 후 한쪽만 사용
- Mark and sweep을 실시 후 파편화 된 영역을 살아남은 인스턴스만 다른 공간으로 효율적으로 재배치 → Survivor의 S0, S1 개념
- 단점 → 가용 메모리 공간이 절반으로 줄어 듦 → 개선하기 위해 (8:1:1) 비율이 제시됨
Mark and compact
- Survivor의 살아남은 인스턴스를 Survivor에 이쁘게 정렬하는 방안으로 개선
- 생존한 객체가 많을 수록 복사해야 할 인스턴스가 늘어나는 Mark and sweep의 단점을 극복하기 위해 제안
- 1단계 마크후 2단계에서 생존 객체를 한쪽 구석으로 모으고 나머지만 Sweep
- 단점 :
- 살아남는 객체가 많을 수록 부담이 크게 증가
- 인스턴스 이동 과정에서 응용 프로그램의 연산이 일시정지 (Stop the world 발생!)
클래식 GC 종류
CMS(Concurrent Mark Sweep) GC
- Java9 부터 사용하지 않다가 Java14에서 G1GC를 지원하고자 완전히 제거
G1 GC (Garbage First GC)
- 4gb 이상 대용량 힙 메모리를 사용하는 멀티스레드 기반 응용 프로그램에 특화된 GC
- 힙 영역을 (1~32MB)단위로 분할 후 멀티스레드로 스캔
- JVM힙을 세대 단위가 아닌 독립영역으로 구분해 관리하는 것이 특징
- New Generation, Old Generation, Pernament 영역에 대한 구분이 사라졌다. (각각의 칸이 N, O, P가 될수 있다.)
- 힙 영역을 작은 단위로 분할한 후 멀티스레드로 스캔
- 서버용 응용 프로그램에 집중한 GC이다. (JDK 9부터 기본 GC)
- 힙의 모든 여역을 회수 집합에 포함시켜 영역 단위 처리
- 가장 쓰레기가 많은 영역을 파악
- 회수시 가장 득이 되는 영역을 파악
- Stop the world가 획기 적으로 많이 줄어들었다.

이전 방식은 구역이 확실히 나뉘어져 있었다.

반면 G1GC는 명확히 구역이 정해져 있지 않고 그때 그때 상황에 따라 구역이 정해진다.
또한 사라질 인스턴스가 많은 영역을 확인하여 해당 영역은 완전히 없애 버리고, 해당 영역안에 유지 되어야 할 인스턴스는 새로운 영역으로 이동한다. 이로 인해 Stop the world 발생 빈도를 많이 줄일수 있다.
'테크톡 딥다이브' 카테고리의 다른 글
| 의미 있는 테스트 코드에 대해 알아보자 (0) | 2025.02.24 |
|---|---|
| 카카오 선물하기 팀의 캐싱 전략 (하이브리드 캐시와 캐시 웜업 자동화) (1) | 2025.01.07 |
| DB Replication (with 우아한 테크 코스's 테크톡) (4) | 2025.01.03 |
| OAuth 2.1과 2.0 차이 (2) | 2024.12.08 |
| 안정적인 서비스 배포 - (롤링, 블루그린, 카나리) (1) | 2024.12.08 |