[JAVA] Garbage Collection(가비지 컬렉션)의 개념과 동작 과정
Garbage Collection(가비지 컬렉션)이란?
JVM에는 Garbage Collecter(가비지 컬렉터)가 존재한다. 가비지 컬렉터는 더 이상 참조되지 않는 Garbage(가비지)라고 불리는 불필요한 메모리를 알아서 정리해주는 역할을 한다. 가비지 컬렉터가 주기적으로 메모리 누수를 방지하기 위해 메모리를 청소하는 과정을 Garbage Collection(이하 GC)라고 한다.
JVM에 대해 잘 모른다면 다음을 참고하자.
Stop-the-world
GC에 대해 알아보기 전에 stop-the-world라는 용어를 알아야 한다. stop-the-world란 GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. stop-the-world가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춘다. GC 작업을 완료한 이후에야 중단했던 작업을 다시 시작한다. 어떤 GC알고리즘을 사용하더라도 stop-the-world가 발생한다. GC 튜닝이란 stop-the-world 시간을 줄이는 것이다.
Weak Generation Hypothesis과 Heap 영역
JVM의 Heap 영역은 처음 설계될 때 Weak Generation Hypothesis란 다음과 같은 두 가지 가설을 전제로 설계되었다.
- 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다.
- 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
이 가설의 장점을 살리기 위해 JVM의 Heap 영역에는 두 개의 영역이 존재한다.
(참고 : java8 이전에는 Permanent Generation이 존재했지만 java8 이후 사라지고 Metaspace로 바뀌었다. )
- Young 영역(Young Generation)
- 새롭게 생성된 객체가 할당되는 영역
- 대부분의 객체가 금방 Unreachable 상태가 되므로 많은 객체가 Young영역에 생성되었다 사라진다.
- Young영역에 대한 GC를 Minor GC라고 부른다.
- Old 영역(Old Generation)
- Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
- 복사되는 과정에서 대부분 Young 영역보다 크게 할당되며, 크기가 큰 만큼 가비지는 적게 발생한다.
- Old 영역에 대한 GC를 Major GC 또는 Full GC라고 부른다.
Minor GC
Young 영역에는 다음과 같은 3개의 영역이 존재한다.
- Eden 영역 : 새로 생성된 객체가 할당되는 영역
- Survivor 0,1 영역 : 최소 1번의 GC 이후 살아남은 객체가 존재하는 영역
Minor GC는 Young 영역에서 일어나는 GC이다. Minor GC의 과정은 다음과 같다.
1. 새로 생성된 객체가 Eden 영역에 할당된다.
2. Eden 영역이 가득 차게 되면 Minor GC가 발생한다.
1) Eden 영역에서 사용되지 않는(=참조되지 않는) 객체의 메모리가 해제된다.
2) Eden 영역에서 살아남은(=해제되지 않은) 객체는 Survivor 0,1 영역 중 하나로 이동한다.
3. 위 과정이 반복되다 Survivor 영역이 가득 차면 Survivor영역의 살아남은 객체를 다른 Survivor 영역으로 이동시킨다.
4. 위 과정을 반복하여 계속해서 살아남은 객체는 Old 영역으로 이동된다.
3번 과정에서 주의할 점은 Survivor 영역 중 하나는 반드시 비어있는 상태로 남아 있어야 한다는 것이다. 만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 영역 모두 사용량이 0이라면 시스템이 정상적인 상황이 아닌 것이다.
[그림 3]에서는 Survivor0 에서 Survivor1로 이동하는 것을 예시로 들었을 뿐, 무조건 0에서 1로 이동하는 것은 아니다.
Major GC
Major GC는 Old 영역이 데이터가 가득 차면 발생한다. 보통 Old 영역은 Young 영역보다 크게 할당하며, 이러한 이유로 Old 영역의 GC는 Young영역보다 적게 발생한다. 또한 크기가 크기 때문에 Minor GC보다 시간이 오래걸린다.
즉, Major GC는 Old 영역의 더 이상 사용되지 않는 객체의 메모리가 해제되는 과정이다.
참고