가비지 컬렉션(Garbage Collection)이란?
JVM? Java와 OS 사이의 중개자 역할을 하는 Stack기반의 가상머신. OS에게 자바 어플리케이션을 실행하기 위해 필요한 메모리 영역을 할당 받는다.
GC의 동작 방식
Heap 영역을 설계할 때, 크게 두 가지로 나누게 되었는데 Young 영역과 Old 영역으로 나누었습니다.
Young 영역
새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다.
Old 영역
접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 말한다.
Young, Old 영역이 할당받는 메모리 크기가 다르므로(일반적으로 Old영역을 더 크게 할당),구조 역시 다릅니다. 하지만 어떤 GC알고리즘을 구현해도 다음 두 가지의 공통 단계를 따릅니다.
1. Stop The World
- 가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업.
- GC가 실행될 때는 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되고, GC가 완료되면 작업이 재개된다.
- 당연히 모든 쓰레드들의 작업이 중단되면 애플리케이션이 멈추기 때문에, GC의 성능 개선을 위해 튜닝을 한다고 하면 보통 stop-the-world의 시간을 줄이는 작업을 하는 것이다.
2. Mark and Sweep
- Mark: 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
- Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업
GC의 한계
- 어떤 방식의 GC를 해도 어플리케이션을 중단해야 하기 때문에 성능 하락을 피할 수 없습니다.
- GC는 더이상 접근이 불가능한 객체만 회수하기 때문에 메모리 누수가 발생합니다.