Java Garbage Collection

Words
349
Reading
2 min
Listen
Play
9y

Java GC의 성능은 미사용 객체 찾기, 가용 메모리 생성, 힙 압축과 같은 기본 동작에 따라 좌우

[Stop the world pause]

  • JVM이 주로 GC 수행을 위해 모든 애플리케이션 스레드를 중지시는 행위

  • 이 중지를 최소화시켜 애플리케이션의 성능을 높여야 함

[제너레이션]

  • 모든 가비지 컬렉터는 힙을 별도의 제너레이션으로 나눔

  • 올드(종신 - tenured) 제너레이션 : 이하 OG

  • 영 제너레이션 (에덴/eden + 서바이서 스페이스/survivor space) : 이하 YG

  • 객체는 먼저 힙의 부분 집합 일부인 YG(에덴)에 할당

  • YG가 가득 차면 GC는 모든 애플리케이션 쓰레드를 멈추고 YG를 비움

  • 더 이상 사용되지 않는 객체는 폐기되고 여전히 사용 중인 객체는 서바이버 스페이스나 OG로 이동 - Minor GC 동작

[제너레이션 설계의 장점]

  • 영 제너레이션은 전체 힙의 일부분일 뿐이므로 전체 힙을 처리하는 것보다 더 빠르다

더 짧게, 자주 GC 수행

  • Minor GC 수행 후 YG는 자동으로 압축

  • OG이 가득 차면 GC 수행 - Full GC

애플리케이션 쓰레드가 오래 중지

  • 애플리케이션 쓰레드가 실행되는 동안 미사용 객체를 찾는 것이 가능

동시 병렬 컬렉터/concurrent collector (CMS, G1 collector) : 더 적게 중지되지만, 더 많은 CPU 사용

[GC 알고리즘]

시리얼 가비지 컬렉터 / Serial Garbage Collector

  • 단일 프로세서, 윈도우 32비트 JVM의 디폴트 컬렉터

  • GC를 위해 단일 스레드를 사용 : 마이너,풀 GC 수행 시 애플리케이션 쓰레드가 멈춤

  • 풀 GC가 일어나는 동안 OG는 완전히 압축

-XX:+UseSerialGC 플래그로 활성화 (+ -> -로 바꾸면 비활성)

처리율 컬렉터 / Throughput Collector (병렬 컬렉터 / Parallel Collector)

  • 다중 CPU 유닉스 머신, 64비트 JVM의 디폴트 컬렉터

  • 여러 쓰레드를 사용

  • JDK 7u4 이후의 릴리즈 버전에서 디폴트

  • 마이너,풀 GC 때 모든 애플리케이션 쓰레드를 멈춤

  • 풀 GC에서는 YG를 완전히 압축

-XX:+UseParallelGC -XX:+UseParallelOldGC

CMS 컬렉터

  • 풀 GC 수행시 긴 중지 현상을 없애도록 설계

  • YG를 수집하는 데 다른 알고리즘을 사용

  • 마이너 GC 수행 때에만 애플리케이션 쓰레드가 중지

  • 주기적으로 애플리케이션 쓰레드를 멈추지 않고 OG를 살핌

  • 미사용 객체를 폐기하는데 하나 이상의 백그라운드 쓰레드를 사용

  • CPU 사용량 증가

  • 힙 단편화 발생 가능 : 단편화가 너무 많이 발생하면 시리얼 컬렉터 수행

-XX:+UseConcMarkSweepGC -XX:UseParNewGC

G1 컬렉터 (Garbage First)

  • 최소한의 중지 및 약 4GB 이상 큰 힙을 처리하도록 설계

  • 힙을 여러 개로 나누지만, 여전히 YG 기반 컬렉터

  • 동시 병렬 컬렉터

  • 힙 단편화가 일어날 수 있지만 그 확률이 훨씬 낮음

  • G1은 한 영역에서 다른 데로 복사해서 OG 객체 정리와 동시에 부분적으로 힙을 압축

-XX:UseG1GC