GC 용어
GC (Garbage Collection)
- Java Application에서 사용하지 않는 메모리를 자동으로 수거하는 기능
STW (Stop-The-World)
- GC가 메모리 정리를 위해서 어플리케이션의 실행을 중지시키는 행위
- GC 튜닝을 한다면 이 시간을 줄여야 함
OOM (Out Of Memory)
- Heap 메모리 부족 시 발생되는 에러 상황 및 메시지
Mark
- Object가 현재 사용되고 있는지에 대한 검사
- Referrer가 존재하는지 확인하는 것으로 Minor GC 단계에서 주로 수행됨
Sweep
- Mark 대상에 대해서 회수 작업 (메모리상에 미사용으로 처리)
- Minor GC 단계에서 주로 수행됨
Compact
- 디스크 조각모음 하듯이 메모리 공간 확보 Major GC 단계에서 수행됨
GC 과정
Java에서는 개발자가 메모리를 명시적으로 해제하지 않는다.
대신에 Garbage Collector 가 더 이상 필요 없는 객체를 찾아 지우는 작업을 한다.
이 가비지 컬렉터는 두 가지 가설 전제 하에 만들어졌다.
Weak Generational Hypothesis
- 대부분의 객체는 금방 접근 불가능 상태가 된다. 할당되고 짧은 시간 내에 사용이 종료되어 불필요한 상태인 것이 거의 대부분이다.
- 오래된 객체에서 젊은 객체로의 참조는 거의 발생하지 않는다.
이 가설의 장점을 최대한 살리기 위해서 메모리를 몇가지 영역으로 분리하여 관리하는 것이 효과적이다.
JVM Memory 영역

Young
: 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다.
Old
: 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다.
Perm
: Method 영역이라고도 부른다. Class, Method 등 메타 데이터가 저장된다.
GC 종류
Minor GC
: Young 영역에서 발생하는 GC
Major(Full) GC
: Old 영역에서 발생하는 GC
GC 발생 과정
- 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
- Eden 영역이 가득 차 Minor GC가 발생하면 살아남은 객체가 Survivor 영역 중 하나로 이동해서 Age가 증가한다.
- 다시 Eden 영역이 가득 차 Minor GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 이동해서 Age가 증가한다.
- 그 Survivor 영역이 가득 차면 그 중에서 살아남은 객체가 다른 Survivor 영역으로 이동해서 Age가 증가한다.
- 1~4 과정을 반복하다가 계속해서 살아남은 객체의 Age가 threshold 설정 값(default 16)이 되면 Old 영역으로 이동한다.
- 1~5 과정을 반복하다가 Old 영역이 가득 차면 Major GC가 발생한다.
이 절차를 확인해 보면 두개의 Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아 있어야 한다.
만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 Survivor 영역 모두 사용량이 0이라면 시스템이 정상적인 상황이 아니라고 생각하면 된다.
GC 방식
- Serial GC
- Parallel GC
- Parallel Compacting GC
- Concurrent Mark Sweep GC
- G1(Garbage First) GC
Java 버전별 GC 방식 default value
- Java 7 > Parallel GC
- Java 8 > Parallel GC
- Java 9 > G1 GC
상세 내용은 잘 설명되어 있는 링크로 대체합니다.
Reference