잡동사니

Java GC(Garbage Collection)의 이해 본문

IT/Java

Java GC(Garbage Collection)의 이해

yeTi 2020. 2. 4. 12:55

안녕하세요. 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로 변경했습니다.

참고자료

Comments