본문 바로가기
기타 CS

(기술 면접 기출) GC종류, 가비지 컬렉션 종류, 설정 명령어

by 밝지 2023. 3. 26.
728x90
반응형

가비지 컬렉션으로 인한 애플리케이션 지연 현상을 최적화하기 위해 다양한 GC 알고리즘이 개발되었다.

 

 

Serial GC

서버의 CPU 코어가 1개일 때 사용하는 가장 단순한 GC. 싱글 스레드여서 가장 stop-the-world 시간이 길다. Minor GC에서는 Mark-Sweep을 사용하고, Major GC에서는 Mark-Sweep-Compact를 사용한다. 

java -XX:+UseSerialGC -jar Application.java

 

 

 

Parallel GC

Java 8의 기본 GC. Serial GC와 알고리즘은 같지만, Young 영역의 Minor GC를 멀티 스레드로 수행한다. (Old 영역은 싱글 스레드) Serial GC에 비해 Stop-the-world 시간이 감소한다.

java -XX:+UseParallelGC -jar Application.java
# -XX:ParallelGCThreads=N : 사용할 스레드 개수 (기본적으로는 cpu 개수만큼 할당된다.)

 

 

Parallel Old GC(Parallel Compacting Collector)

Parallel GC를 개선한 버전이다. Young 영역, Old 영역 모두에서 멀티 스레드로 GC를 수행한다. Mark-Summary-Compact 방식을 이용한다. 

java -XX:+UseParallelOldGC -jar Application.java
# -XX:ParallelGCThreads=N : 사용할 스레드 개수

 

 

 

CMS GC(Concurrent Mark Sweep)

어플리케이션의 스레드와 GC 스레드가 동시에 실행된다. stop-the-world 시간을 최대한 줄이기 위해 고안되었다. 단 GC 과정이 매우 복잡해서 다른 GC 대비 CPU 사용량이 높다. 메모리가 파편화될 수 있다. Java 14에서는 사용이 중지되었다.

 

 

반응형

G1 GC(Garbage First)

Java 9+ 버전의 디폴트 GC이다. 4GB 이상의 힙 메모리, stop-the-world 시간이 0.5초 정도 필요한 상황에 사용한다. (힙메모리가 너무 작을 경우 사용하지 않는 것을 권장한다.) 기존의 GC 알고리즘에서는 힙 영역을 물리적으로 고정된 Young / Old 영역으로 나누어 사용했지만, G1 gc는 이 개념을 뒤엎는 Region 개념을 새로 도입하여 사용한다. 전체 영역을 Region 이란 영역으로 체스같이 분할하여 상황에 따라 Eden, Survivor, Old 역할을 동적으로 부여하여 사용한다. 일일히 메모리를 탐색해 객체들을 제거하지 않고, 메모리가 많이 차있는 region을 인식해 우선적으로 GC한다. 즉, G1 GC는 힙메모리 전역을 탐색하는 것이 아니라 힙 메모리를 region으로 나누어 탐색하고 GC 역시 region 별로 일어난다. 또한 이전처럼 살아남은 객체들이 순차적으로(Eden -> Survivor0 -> Survivor1) 이동하지 않는다. G1 GC는 효율적이라고 생각하는 위치로 객체를 재할당한다. (예: Survivor1에 있는 객체가 Eden 영역으로 가는게 효율적이면 Eden으로 할당한다.)

java -XX:+UseG1GC -jar Application.java

 

 

 

Shenandoah GC (셰넌도어 GC)

Java 12에 릴리즈되었다. 레드햇에서 개발했다. 강력한 Concurrency와 가벼운 GC 로직으로 heap 사이즈에 영향을 받지 않고 일정한 pause 시간을 사용한다.

java -XX:+UseShenandoahGC -jar Application.java

 

 

 

ZGC (Z Garbage Collector)

Java 15에 릴리즈되었다. 8MB~16TB를 low-latency(레이턴시 - 자극과 반응 사이의 시간, 지연 시간)로 처리하기 위해 디자인되었다. G1의 Region처럼 ZGC는 ZPage라는 영역을 사용하며, G1의 Region이 크기가 고정인 것에 비해 ZPage는 2mb의 배수로 동적으로 운영된다. 힙 크기가 증가하더라도 stop-the-world 시간이 10ms를 넘지 않는다.

java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -jar Application.java
728x90
반응형