자바의 메모리 관리 방법 중 하나로 JVM의 Heap영역에서 동적로 할당했던 메모리 중 필요없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스를 말한다.
C언어나 C++같은 언어는 수동으로 메모리를 관리하도록 설계되어 개발자가 메모리 사용 후 운영체제에 반환하지 않고 프로세스가 점점 커진다면 "메모리 닉"버그가 발생한다. 반면 JAVA는 JVM을 통해 메모리를 할당받고 사용되지 않는 메모리는 JVM이 알아서 회수한 다음 해제해준다. JVM의 이러한 메모리 해제 동작을 가비지 컬렉션이라고 하며, 이러한 가비지 컬렉션을 수행하는 주체를 가비지 컬렉터라고 한다.
Product product = new Product("TV");
sellTo(product);
product = null;
Person person = new Person("Dave");
person.sayHello();
person = new Person("Eric");
person.sayHello();
위 코드 각각의 첫 줄에서 new Product("TV")와 new Person("Dave")는 메모리 Heap영역에 할당되었을 것이다. 그 후 해당 메모리 영역을 가리키던 product는 null이 되고 person은 새로운 객체를 참조하게 된다. 이때 이전 참조되었던 new Product("TV")와 new Person("Dave")객체는 어떠한 경로로도 참조되지 않는 Unreachable 상태가 되고 가비지로 판단되어 회수당하는 것이다.
GC가 실행되기 전에 GC가 안전하게 객체를 검사하고 메모리를 해제하기 위해 모든 애플리케이션 스레드가 멈추는 현상이다.
모든 GC 알고리즘에서 공통적으로 발생하고 GC의 종류와 구현 방식에 따라 정지 시간이 달라진다. GC의 성능 개선을 위해 튜닝을 한다고 하면 보통 stop the word의 시간을 줄이는 작업을 하는 것이다.
Stop The Word를 통해 모든 작업을 중단시키면, GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각 어떤 객체를 참조하고 있는지 탐색한다. 이 과정에서 사용되고 있는 메모리를 식별하고(Mark) Mark되지 않은 객체들을 메모리에서 제거(Sweep)한다.
JVM의 Heap 영역은 처음 설계될 때 아래 2가지 전제로 설계된다.
1. 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 됨
2. 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재함
즉, 대부분 객체는 일회성이며 메모리에 오랫동안 머무는 경우는 드물다는 뜻이다. 따라서 JVM 메모리는 객체의 생존 시간에 따라 물리적이 Heap영역을 Young(Eden/Survivor), Old 2가지 영역으로 나누었다.
1. 객체 생성: 새로운 객체는 Eden 영역에 할당된다.
2. Eden 영역 가득 참: Eden 영역이 가득 차면 Minor GC가 발생한다.
3. Mark and Sweep 수행:

4. Survivor 영역 관리:

5. Promotion:

1. Old 영역 가득 참: Old 영역의 메모리가 부족해지면 Major GC가 발생한다.
2. Mark and Sweep 수행: