Java GC(Garbage Collection)의 이해
안녕하세요. yeTi입니다.
오늘은 Java의 GC(Garbage Collection)에 대해서 알아보겠습니다.
Oracle JDK 8
Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide를 참고하여 작성했습니다.
GC (Garbage Collector)란? 메모리 관리 툴입니다.
GC는 다음의 세가지 작업을 수행합니다.
- Young 영역(Young Generation) 에 객체를 할당하고 오래된 객체를 Old 영역(Old Generation)으로 옮깁니다.
- 힙 메모리의 전체 점유율이 임계 값을 초과하면 Java HotSpot VM이 마킹 단계를 트리거 하고, 동시(병렬) 마킹 단계에서 Old 영역에 살아있는 객체를 찾습니다.
- 병렬 복사 작업으로 살아있는 객체를 압축하여 사용가능한 메모리를 확보합니다.
이 때 Young 영역(Young Generation)이 찼을 때 발생하는 GC를 Minor GC라고 하고 Old 영역(Old Generation)이 찼을 때 발생하는 GC를 Major GC라고 한다.
GC의 종류는 다음과 같다.
- Serial Collector
- Parallel Collector
- Concurrent Mark Sweep (CMS) Collector
- Garbage-First Garbage Collector
Serial Collector
사용법 : -XX:+UseSerialGC
싱글 쓰레드로 GC를 수행한다. 싱글 프로세서 머신에 적합한 Collector이다.
Parallel Collector (throughput collector)
사용법 : -XX:+UseParallelGC
or -XX:+UseParallelOldGC
Minor GC를 병렬로 처리한다. 멀티 프로세서나 멀티 쓰레드 하드웨어에서 돌아가는 중간 혹은 큰 사이즈의 데이터를 처리하는 어플리케이션에 적합한 Collector이다.
사용법에 따라 Major GC도 병렬로 처리하는 옵션을 줄 수 있는데, -XX:+UseParallelGC
는 싱글 쓰레드로 처리하고 -XX:+UseParallelOldGC
는 병렬로 처리한다.
Concurrent Mark Sweep (CMS) Collector
사용법 : -XX:+UseConcMarkSweepGC
GC가 짧게 일어나는것이 중요한 환경을 위해 설계됐다. 일반적으로 두개 이상의 프로세서가 수행되는 환경에서 큰 크기의 데이터가 오해 사는 환경에서 이점이 있는 Collector이다.
Garbage-First (G1) Garbage Collector
사용법 : -XX:+UseG1GC
큰 메모리를 가진 멀티 프로세서 환경인 서버에 적합한 Collector이다. 따라서 높은 througput을 유지하도록 하고 짧은 pause time을 가져가도록 합니다.
OpenJDK 11
OpenJDK Wiki - Garbage Collection에서 자세한 정보를 확인할 수 있습니다.
대부분은 Oracle JDK 8에서 언급했던 부분과 일치하여 기술하지 않았고, 특이점만 언급하면 JDK9부터 기본 GC로 Parallel GC에서 G1 GC로 변경했습니다.