가비지 컬렉터는 JVM의 힙 영역에서 동적으로 할당했던 메모리 객체 중 더이상 사용하지 않는 객체들을 주기적으로 제거하여 메모리를 회수하는 역할을 한다. 개발자가 메모리 관리나 누수에 대해 직접 관리하지 않아도 된다.
stop-the-world란 GC를 실행하기 위해 애플리케이션 실행을 잠시 중단하는 것을 말한다. stop-the-world가 발생하면 GC를 실행하는 스레드 외에 모든 스레드가 작업을 멈춘다. 그리고 GC 작업이 끝나면 다시 중단했던 작업을 이어간다.
어떤 알고리즘을 사용하더라도 stop-the-world는 발생하며, 이를 줄이기 위해 GC 튜닝을 하기도 한다.
GC는 'weak generational hypothesis' 라 불리는 두 가지 전제 조건(가설) 하에 만들어졌다.
이에 따라 HotSpot VM에서는 힙을 크게 young영역과old영역으로 나누었다.

young 영역: 생성된 대부분의 객체가 이곳에 위치한다. 대부분 금방 접근 불가능한 상태가 되어 대부분의 객체는 이곳에 위치해있다가 사라진다. 이 영역에 대한 GC를 Minor GC라고한다.old영역: 접근 불가능 상태가 되지 않아 young영역에서 살아남은 객체가 여기로 복사된다. 보통 young영역 보다 크게 할당하고 GC는 young영역보다 적게 발생한다. 이 영역에 대한 GC를 Major GC라고한다.Young영역은 또 다시 Eden영역과 2개의 Survivor영역으로 나뉜다.
Eden영역은 new를 통해 새로 생성된 객체가 위치하는 영역이다. 이곳에서 GC가 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동한다.Eden영역에서 GC가 계속 발생하면 Survivor 영역에 객체가 계속 쌓인다.Survivor영역이 가득 차면 그중에서 살아남은 객체를 비어있는 Survivor영역으로 이동하고, 기존 Survivor영역은 비운다. old영역 으로 이동(Promotion)한다.old영역이 가득 차면 Major GC가 발생한다.Mark-Sweep / Mark-Summary-Compact
1. Mark-Sweep
- Mark: GC Root 부터 시작하여 연결된 모든 객체를 추적 & 참조 관계가 살아있는 객체에 마킹
- Sweep: 힙을 훑으며 마킹되지 않는 객체를 메모리에서 해제. 마킹 되지 않은 객체들이 차지하던 공간을 표시하여 나중에도 사용할 수 있도록 함.
=> 객체를 지우고난 공간이 군데군데 비어있게 되어 메모리 파편화가 발생함. 따라서 일반적으로는 이 객체들을 한곳으로 모아주는 Compact(압축)과정을 추가한 Mark-Sweep-Compact를 더 많이 사용함.
- Mark-Summary-Compact
- Mark: 위와 동일
- Summary: 각 영역에 밀도를 계산하여 살아있는 객체가 많은 공간과 비어있는 곳이 많은 공간인지를 조사하여 압축 후 객체가 최종적으로 위치할 곳을 결정
- Compact: summary 에서 결정한 위치로 살아있는 객체를 이동
Minor GC는 Young 영역에서 객체가 사라지는 것이다. Young 영역은 Old 영역보다 일반적으로 크기가 작기 때문에 GC가 짧은 시간내에 종료되어 애플리케이션 성능에 영향을 주지 않는다.
하지만 Major GC는 보다 더 큰 영역에서 실행되고 속도가 더 느리다.
Mark-Sweep 방식을 쓰고, Major GC에는 Mark-Sweep-Compact 알고리즘을 사용한다.
Mark-Summary-Compact 방식을 사용한다.

객체 대피 과정이 있으며, 이때 멈춤 현상(STW)가 일어난다. (이동 시킨 후 해당 객체를 참조하고 있던 포인터 정보를 새로운 주소로 업데이트)
Java Garbage Collection
Java Reference와 GC
가비지 컬렉션 동작 원리 & GC 종류 총정리