주요 용어
GC(Garbage Collection) : JVM이 더 이상 사용(참조)되지 않는 객체를 자동으로 메모리에서 제거해주는 기능
처리량(Throughput)
Garbage Collection(이하 GC)에 소요되지 않은 시간(백분율)
특정 기간 동안 애플리케이션의 작업량을 극대화하는 데 중점을 둔다.
처리량 측정 방법의 예는 다음과 같다
주어진 시간 내에 완료된 트랜잭션의 수
배치 프로그램이 한 시간 안에 완료할 수 있는 작업의 수
1시간 안에 완료할 수 있는 데이터베이스 쿼리의 수
일시 정지(Pauses)
애플리케이션이 GC로 인해 아무런 응답을 주지 않을 때
힙(Heap)
자바 객체가 저장되는 메모리 영역
GC의 주요 대상
Stop the World(STW) 이벤트
GC를 수행하거나 특정 작업을 위해, 모든 실행 중인 애플리케이션의 스레드를 일시 정지 시키는 것
이 때는 GC 관련 스레드만 작동하고, 그 외의 모든 사용자 스레드는 멈춰 있다.
대표적인 STW 이벤트 발생 상황은 다음과 같다
Minor GC
Major/Full GC
Class Loading
JIT 컴파일
Heap Dump
System.gc() 호출
Reachability(도달성, 도달능력)
객체에 참조가 있다면 Reachable로 구분, 객체에 유효한 참조가 없다면 Unreachable로 구분하고 수거한다.
JVM Heap Memory
Young Generation
새로운 객체는 Young Generation(이하 YG)에 할당된다.
Minor GC는 YG에서 발생한다.
Minor GC는 YG가 가득 찼을 때 발생하며, 참조되지 않는 (죽은) 모든 객체는 YG에서 정리된다.
정리되지 않은 일부 객체는 YG에 남아 노화되며, Old Generation(이하 OG)로 이동한다.
Eden
신규 객체 대부분이 생성되는 공간
대부분의 객체는 Eden에 생성된 뒤, 살아남는다면 Survivor 영역으로 이동한다.
Eden 영역이 가득 차면 Minor GC가 발생하며, 살아있는 객체를 Survivor 영역으로 이동시키고 나머지는 제거된다
Eden → S0 또는 S1로 이동
S0 (Survivor Space 0)
Eden 에서 살아남은 객체들이 임시로 옮겨지는 공간
한 번 GC를 통과한 객체들이 저장된다
S0 → S1 로 반복해서 살아남을 경우, 객체의 age가 증가한다
일정 age(HotSpot JVM 기준 15) 을 넘으면 Old Generation 으로 승격(Promotion) 된다 ]
age 값
Survivor 영역에서 객체가 살아남은 횟수를 의미하는 값이며, Object Header에 기록된다
S1 (Survivor Space 1)
S0과 마찬가지로 Survivor 공간이지만, GC 시마다 S0 ↔ S1 역할이 바뀐다
GC 시점에 하나는 from 공간(현재 살아있는 객체가 있는 공간), 다른 하나는 to 공간(살아남은 객체를 복사해 넣는 공간)으로 사용된다.
Old(Tenured) Generation
OG은 오랫동안 살아남은 오래된 객체를 저장하는 데 사용된다
Major GC가 발생한다
JVM Heap에서 Major GC는 모든 활성 객체를 포함하기에 Minor GC보다 훨씬 느리다
Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 GC는 적게 발생한다
Permanet Generation(until Java 7)
Permanet Generation(이하 PG) 에는 JVM 에서 애플리케이션에 사용되는 클래스와 메서드를 설명하는 데 필요한 메타데이터가 들어있다.