본문 바로가기
공부이야기/Java

[Java] GC의 종류 (Garbage Collector)

by coderoom 2021. 5. 10.

 

 

GC (Garbage Collector)란?

힙 내의 객체 중에서 Garbage를 찾아내고 찾아낸 Garbage를 처리해서 힙의 메모리를 회수한다. 이를 Garbage Collection이라 하며 JVM에서 이를 자동으로 수행하는 프로세스를 GC(Garbage Collector)라고 한다.

 

JAVA에서 객체가 생성되면 해당 객체는 JVM의 Heap영역의 메모리를 점유 한다. 해당 객체는 현재 참조 되지 않더라도 메모리 공간을 점유 한다. 물론 메모리 공간은 한정적이다. 한정적인 메모리에 현재 사용되지 않는 객체가 점유한 공간을 재때 정리해 주지 않으면 메모리 공간이 부족해 지고, 결국은 Out Of Memory Error 가 발생 할 수 밖에 없다.

 

 


 

 

 

Serial GC

순차적인 GC. Single Thread로 Young/Old 영역을 처리한다.

하나의 Thread를 이용하기 때문에 멀티 Thread 환경에서는 부적합 -> 일시 중지에 관대한 Client 또는 Test 프로그램에 적합

MSC(Mark-Sweep-Compact) 알고리즘 사용

java -XXL:UseSerialGC

 

Parallel GC (Throughput Collector)

Minor GC를 멀티 Thread를 이용하여 동시에 처리 (Major GC는 Single Thread로 처리)

Serial GC보다 빠르지만 더 많은 자원 소모

MSC(Mark-Sweep-Compact) 알고리즘 사용

java -XX:+UseParallelGC

 

CMS GC (Concurrent Mark-Sweep)

Serial GC, Parallel GC와 다른 알고리즘 사용 -> 작업이 중단되는 시간을 줄임

STW(Stop-The-World) 시간을 최소화 하는데 초점을 맞췄지만, 하는 일이 많다보니 다른 GC에 비해 많은 메모리와 CPU 사용

Compaction 단계가 기본적으로 제공되지 않고 필요할 때만 일어나 메모리 파편화 발생 가능.

(Compaction: 메모리 할당 공간 사이에 사용하지 않는 빈 공간이 없도록 옮겨서 메모리 단편화를 제거하는 작업)

  • Young Generation Collection: Parallel 알고리즘
  • Old Generation Collection: Concurrent Mark-Sweep
java -XX:+UseConcMarkSweepGC

 

동작 방식

https://118k.tistory.com/843

 

  1. Initial Mark
     : 애플리케이션 일시 정지. Root Set에 의해 직접 참조되는 객체 선택
  2. Concurrent Mark
     : GC 쓰레드는 GC 작업, Working 쓰레드는 애플리케이션 작업. 바로 전 단계에서 체크한 객체가 바라보고 있는 객체 식별
  3. Remark
     : 애플리케이션 일시 정지. GC에 멀티 스레드 사용. 2번에서 추가로 참조가 끊긴 객체 확인
  4. Concurrent Sweep
     : 참조가 끊긴 모든 객체 정리

 

 

 

 

G1 GC (Garbage First)

하드웨어가 발전되어 JVM을 가동하는 메모리의 크기도 점점 커져가는데, 이전까지의 GC들은 큰 용량의 메모리에 적합하지 않아 이를 개선하여 큰 Heap 메모리에서 짧은 GC 시간을 보장하는데 목적을 둔 GC.

Heap 영역을 Region이라는 메모리를 블록단위로 나누어 각 Region의 상태에 따라 역할(Eden, Survivor, Old)이 동적으로 부여된다. 

  • G1이란: Garbage로 가득찬 리전부터 컬렉션을 시작한다는 의미
java -XX:+UseG1GC

 

동작 방식

  1. Initial Mark: Old Region에 존재하는 객체들이 참조하는 Survivor Region을 찾는다. 이때  STW 발생.
  2. Root Region Scan: Initial Mark에서 찾은 Survivor Region에서 GC 대상 객체를 탐색한다.
  3. Concurrent Mark: 전체 Region에 대해 스캔하여 GC 대상 객체가 존재하지 않는 Region은 이후 단계에서 제외된다.
  4. Remark: STW 후, GC 대상에서 제외할 객체를 식별한다.
  5. Cleanup: STW 후, 살아있는 객체가 가장 적은 Region에 대해서 참조되지 않는 객체를 제거한다. 완전히 비워진 Region을 Freelist에 추가하여 재사용한다.
  6. Copy: Root Region Scan 단계에서 찾은 GC 대상 Region이었지만 Cleanup 단계에서 살아남은 객체들을 Available/Unused Region에 복사하여 Compaction 작업을 수행한다.

https://velog.io/@hygoogi/자바-GC에-대해서

 

 

 

Z GC

확장 가능하고 낮은 지연률을 가진 GC.

정지 시간이 최대 10ms를 초과하지 않음. Heap의 크기가 증가하더라도 정지 시간이 증가하지 않음. 다양한 범위의 Heap 처리 가능.

→ G1 GC의 Region은 고정된 크기인 것에 비해 Z GC에 쓰이는 ZPages는 크기가 2MB의 배수로 동적으로 생성 및 삭제됨.

 

 

 

 

 

참고로, Java 7,8은 기본 GC로 Parallel GC를 사용하고, Java 9,10은 G1 GC를 사용한다고 한다. Java 11부터는 Z GC를 사용할 수 있다.

 

 

 

 

 


 

 

 

 

GC 선택 가이드라인

 

  • 애플리케이션의 일시 정지 시간에 대한 요구 사항이 까다로운 경우가 아니라면, 그냥 일단 애플리케이션을 실행하고 VM이 알아서 Collector를 선택하게 한다. 만약 필요하다면, heap 사이즈를 조절해서 성능 향상 가능.
  • 애플리케이션이 작은 데이터셋(최대 약 100MB)을 다루는 경우 → Serial Collector
  • 애플리케이션이 싱글 프로세서에서 실행되고, 일시 정지 시간에 대한 요구 사항이 없는 경우 → VM이 알아서 또는 Serial Collector
  • 애플리케이션의 최고 성능이 최우선 순위이고, 일시 정지 시간에 대한 요구 사항이 없거나 1초 이상의 일시 정지 시간이 허용되는 경우 → VM이 알아서 또는 Parallel Collector
  • 응답 시간이 전체 처리량보다 중요하고 GC로 인한 일시 정지가 1초보다 짧아야 하는 경우Concurrent Collector 또는 G1GC

성능은 heap 사이즈와, 애플리케이션이 관리하는 라이브 데이터의 양, 사용 가능한 프로세서들의 속도에 따라 달라진다.

일시 정지 시간은 이러한 요소들에 의해 영향을 받으므로, 위에서 언급한 '1초'라는 기준 시간은 어림값일 뿐이다.

 

Parallel Collector를 쓰면 많은 데이터 사이즈와 하드웨어 조합에서 1초 이상의 일시 정지 시간을 경험할 수 있다.

한편, Concurrent Collector는 몇몇 조합에서는 일시 정지 시간을 1초보다 짧게 유지할 수 없다.

 

 

 

 

 

참고 링크

 

 

 

 

 


 

 

 

댓글