GC는 상시 발생하는 작업이 아니라 전담 스레드에 의해 메모리가 부족하다고 판단될때 주기적으로 일어난다.
GC 과정
GC는 힙 메모리를 조사하는 프로세스로, 사용중인 것과 사용중이지 않은 객체를 식별한다. 그리고 사용중이지 않은 객체를 삭제하는 것이다.
- 사용중이거나 참조된 객체는 프로그램의 일부에서 포인터로 유지되는 것을 의미한다.
- 사용중이지 않은 객채는 더 이상 참조되지 않은 것을 의미 한다.
- 그래서 참조되지 않은 객체의 메모리는 반환 될 수 있다.
Step 1. Marking
첫 단계는 마킹 단계다. 가비지 컬렉터는 사용중인 메모리가 사용중이지 않은 메모리를 식별한다. 아래 그림에서, 참조되고 있는 객체는 파란색으로 표시되어 있고, 참조 되지 않은 객체는 주황색으로 표시되어 있다.
- 마킹 단계에서 모든 객체를 탐색하면서 참조중인 객체와 참조되지 않는 객체를 분류한다.
- 모든 객체를 검사해야하는 경우 시간이 매우 오래 걸린다.

Step 2. Normal Deletion
Normal Deletion 는 참조되지 않는 객체를 삭제하고, 참조중인 객체와 여유 공간에 대한 포인터는 남겨둔다.
- 메모리 할당자(Memory Allocator) 는 (신규 객체에 할당될수 있는) 여유 공간 블록에 대한 참조를 가지고 있는다.(반환된 여유공간을 이용하여 나중에 할당이 필요할때 사용)

Step 2a. Deletion with Compacting
메모리 공간을 인접하게 한쪽으로 밀어놓으면 그만큼 신규 메모리 할당을 위한 탐색시간이 짧아짐

왜 세대별(Generational) 가비지 컬렉션인가?