Garbage Collection
Java의 경우 C나 C++와 같이 명시적으로 메모리 반환을 하지 않아도 Java Virtual Machine(JVM)의 Garbage Collector가 불필요한 메모리를 알아서 정리해준다.
Stop the world
Garbage Collection을 실행하기 위해 JVM은 GC작업을 위한 쓰레드 이외에 다른 쓰레드는 전부 작업을 멈추게 하는데 이 작업을 Stop the world라고 말을 한다. 보통 GC튜닝은 Stop the world의 시간을 줄이는 것을 의미한다.
Garbage Collector의 전제 조건 (Weak Generational Hypothesis)
GC는 다음과 같은 조건을 가지고 동작을 한다.
- 대부분의 객체는 금방 접근 불가 상태(unreachable)이 됨
- 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재함
이러한 전제 조건의 장점을 최대한 살리기 위하여 2가지 영역으로 나누어서 관리한다.
이 영역들이 Young영역과 Old영역이다.
- Young 영역 (Young Generation 영역) : 새롭게 생성한 객체가 존재하는 위치, 이 영역에서 객체가 사라질 때 Minor GC가 발생한다.
- Old 영역 (Old Generation 영역) : 접근 불가 상태로 되지 않아 Young에서 살아남은 녀석들은 이쪽 영역으로 옮겨진다. Young 영역보다 GC가 적게 발생하고 이 영역에서 객체가 사라질 때 Major GC(Full GC)가 발생한다고 한다.
Young Generation 영역
Young 영역은 총 3개의 영역으로 구성된다.
- Eden 영역
- Survivor 영역
- Survivor 영역
Survivor영역은 2개로 존재한다. 해당 영역들의 동작은 다음과 같다.
- 처음 생성한 객체는 Eden 영역에 생성된다.
- Eden영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor영역 중 하나로 이동된다.
- 2의 행동이 계속 반복된다.
- 하나의 Survivor 영역이 가득 차면 살아남은 객체를 다른 Survivor로 옮기고 가득 찼던 Survivor영역을 비운다.
- 1~4번을 반복하다가 계속 살아남은 객체는 Old영역으로 이동한다.
Old Ganeration 영역
Old Generation은 단일로 구성 되어있다. 기본적으로 Young Generation 구역들 보다 크기가 크기 때문에 Major GC가 발생 할 때 Minor GC보다 시간이 오래걸린다.