
디폴트 가비지 컬렉터
여러 가비지 컬렉터가 있지만 서버 사양에 따라 디폴트로 정해지는 가비지 컬렉터가 다르다
G1 GC가 디폴트로 등록되는 경우는 서버가 두 개이상의 프로세서를 가지며 RAM 크기가 1.8GB 이상인 경우이며 그 외에는 Serial GC가 디폴트로 등록된다. 따라서 대부분의 서버는 G1 GC가 디폴트로 볼 수 있다.
참고로 내가 운영하는 비밀로그 백엔드 서버는 t2.micro 사양이고 Serial GC를 쓴다. 프로세서가 하나면 Serial GC가 성능상 우위일 때가 많다.
힙 메모리의 동적 변동
JVM의 힙 사이즈는 아래와 같이 결정된다.
initial heap size 시작 크기 - 기본 값 RAM의 1 / 64
maximum heap size 최대 크기 - 기본 값 RAM의 1 / 4
minimum heap size 최소 크기
일반적으로 백엔드 서버는 힙 메모리 크기를 고정시킨다.
왜냐하면 백엔드에서는 서버의 자원을 자바 프로세스에 모두 할당시킨다는 전제 하에 동작하기 때문이다.
그러나 자바 프로그램은 백엔드 서버만 있는 것은 아니고 여러 프로세스와 자원을 나눠 쓰는 경우도 있다.
힙 메모리를 고정시키지 않을 때 GC는 3가지의 목표를 가지며 힙 메모리를 동적으로 조정한다.
1. throughput goal
2. maximum pause-time goal
3. minimum Footprint
1번과 2번을 충족하기 위해 힙 메모리 크기를 동적으로 조정하며 1,2번을 모두 충족하면 3번을 충족하려한다.
1. throughput goal
스루풋 골이란 사용자가 지정한 GC 타임과 애플리케이션 타임의 비율을 초과하지 않으려고 하는 것이다.
여기서 애플리케이션 타임이란 GC타임을 제외한 모든 시간을 뜻하며, GC타임 / 애플리케이션 타임의 목표를 맞추는 것이다.
-XX:GCTimeRatio=nnn으로 지정가능하며 공식은 1 / (1+n) 이다.
5%로 지정하고 싶으면 n을 19로 지정하면 되고 1 / 20 으로 5%가 된다.
만약 이 비율이 5%를 초과하면 GC는 힙 사이즈를 늘려 스루풋 골을 만족시키려한다.
힙 사이즈를 늘리면 객체를 많이 저장할 수 있기 때문에 GC발생시의 GC스파이크는 높아지겠지만 전체 애플리케이션의 스루풋 골은 낮아진다.
2. maximum pause-time goal
pause-time이란 GC로 인해 애플리케이션이 멈추는 시간이다.
맥시멈 포즈타임 골은 하나의 GC타임이 사용자가 지정한 시간보다는 무조건 낮아야한다는 뜻이다.
-XX:MaxGCPauseMillis=nnn으로 지정가능하다.
만약 GC타임이 목표보다 높아지면 GC는 동적으로 힙 사이즈를 줄인다.
객체가 적게 저장되기 때문에 한번의 GC발생에서 GC타임이 낮아지기 때문이다.
3. minimum Footprint
Footprint는 프로세스가 현재 사용중인 메모리의 크기다.
Footprint의 조정은 throughput goal과 maximum pause-time goal가 모두 충족되었을 때 수행되며 힙 사이즈를 조금씩 줄이는 방식이다. 자바 프로그램은 서버에서만 쓰이는 것이 아니기 때문에 다른 프로세스도 쓸 수 있는 메모리 공간을 남기기 위한 목적이다.
throughput goal과 maximum pause-time goal에 대한 GC에 대응방법은 상반된다. 한 쪽은 힙 사이즈를 늘리며 한 쪽은 힙 사이즈를 줄인다. 만약 최적의 힙 사이즈를 찾아 두 목표가 모두 만족되었을 때 힙 사이즈를 조금씩 줄여나가는 것이다.
힙 사이즈를 조금씩 줄이다가 두 목표 중 하나가 충족되지 않으면 다시 두 목표 사이에서 균형점을 잡는다.
'Java > GC' 카테고리의 다른 글
| 메서드 영역의 GC와 Hibernate의 프록시 생성 로직에 관하여 (0) | 2026.05.15 |
|---|---|
| 자바의 6가지 가비지 컬렉터 (0) | 2026.05.02 |
| 풀 GC - 마크 스윕 컴팩트 알고리즘 그림 (0) | 2026.04.23 |
| 마이너 GC - 마크 카피 알고리즘 그림 (1) | 2026.04.09 |