[JAVA] #5 GC - JAVA 버전 별 주요 알고리즘

대복·2025년 5월 10일

JAVA

목록 보기
6/6
post-thumbnail

주요 GC 알고리즘

GC의 동작 방식과 목적에 따라 다양한 알고리즘이 개발되었다. 각 알고리즘은 Stop-the-World(STW) 시간, 처리량(Throughput), 메모리 사용량 등에서 장단점을 가진다.

  • STW는 GC가 작업을 수행하는 동안 애플리케이션 스레드를 모두 멈추는 시간을 의미하며, 이 시간이 길수록 애플리케이션의 응답성이 떨어진다.
  • 처리량(Throughput)이란 CPU 시간을 GC에 사용하는 시간보다 애플리케이션 코드 실행에 사용하는 시간의 비율을 높이는 것을 의미한다.

1. Serial GC

  • 특징: 가장 기본적인 GC 구현체이다. 하나의 스레드(Single Thread)로 GC 작업을 수행한다.

  • STW: GC가 실행되는 동안 모든 애플리케이션 스레드를 완전히 정지(Stop-the-World)시킨다.

  • 장점: 구현이 간단하고, 적은 메모리와 CPU 자원을 사용한다.

  • 단점: 멀티스레드 환경에서는 GC 중 애플리케이션이 완전히 멈추기 때문에 응답 시간이 매우 길어질 수 있다.

  • 사용 시점: 클라이언트 애플리케이션이나 소규모 단일 스레드 애플리케이션, 또는 애플리케이션 일시 정지가 허용되는 환경에서 사용하기 적합하다.

  • Compact: Sweep 이후 Compact 과정을 수행하여 메모리 단편화를 제거한다.


2. Parallel GC

  • 특징: Java 8의 기본 GC이다. 다수의 스레드(Multi-Thread)를 사용하여 Young 영역 및 Old 영역의 GC 작업을 병렬로 수행한다.(처리량 극대화에 초점을 맞춘 알고리즘이다.)

  • STW: Serial GC와 마찬가지로 GC가 수행될 때 모든 애플리케이션 스레드가 정지(STW)된다. 하지만 GC 작업을 여러 스레드가 병렬로 처리하기 때문에, Serial GC에 비해 STW 시간 자체가 짧아진다.

  • 장점: 멀티코어 CPU 환경에서 GC 처리 속도가 Serial GC보다 훨씬 빠르다. 전체적인 애플리케이션의 처리량을 높이는 데 효과적이다.

  • 단점: STW 시간이 발생하므로, 짧은 응답 시간이 중요한 애플리케이션에는 부적합할 수 있다.

  • Compact: Sweep 이후 Compact 과정을 수행한다.


3. CMS GC (Concurrent Mark Sweep)

  • 특징: STW 시간을 최소화하는 데 중점을 둔 GC이다. Heap 메모리의 크기가 클 때 발생하는 긴 Major GC 시간을 줄이기 위해 설계되었다. 다수의 스레드를 사용하며, GC 작업의 대부분을 애플리케이션 스레드와 동시에(Concurrent) 수행한다.

  • STW: GC 과정 중 STW가 발생하는 구간은 매우 짧다. GC 작업의 많은 부분이 애플리케이션이 실행되는 동안 백그라운드에서 수행된다.

  • 동작 단계 (Mark 과정 상세):

    • Initial Mark (초기 마크): GC Roots에서 직접적으로 참조되는 객체들만 아주 짧은 시간 동안 마킹한다. 매우 짧은 STW 구간이다.
    • Concurrent Mark (동시 마크): Initial Mark 단계에서 마킹된 객체들로부터 시작하여 객체 참조 그래프를 따라가며 모든 살아있는 객체를 추적한다. 이 과정은 애플리케이션 스레드와 동시에 진행된다.
    • Remark (재 마크): Concurrent Mark 단계 중에 객체 참조 관계에 변화가 발생했을 수 있으므로, 이를 반영하여 최종적으로 살아있는 객체를 확정하는 단계이다. 이 단계도 짧은 STW 구간이 발생한다.
    • Concurrent Sweep (동시 청소): Mark 단계에서 마킹되지 않은 객체들의 메모리 공간을 회수한다. 이 과정은 애플리케이션 스레드와 동시에 진행된다.
  • 장점: STW 시간이 매우 짧아 애플리케이션의 응답성이 중요한 서비스에 적합하다.

  • 단점:

    • GC 작업이 애플리케이션과 동시에 실행되므로, CPU 리소스를 더 많이 사용한다.
    • Compact 과정을 수행하지 않아 메모리 단편화가 발생할 수 있다.
    • Concurrent Mark 단계에서 애플리케이션이 객체를 빠르게 생성하여 GC 속도보다 할당 속도가 빠르면 Concurrent Mode Failure가 발생하여 STW Full GC가 실행될 수 있다.
    • JDK 9부터 사용 중단(Deprecated)되었고, 이후 버전에서 제거되었다.

Concurrent Mode Failure: 동시적으로 GC 작업을 수행하는 모드로는 더 이상 안정적으로 메모리를 관리할 수 없다"는 의미
STW Full GC: Concurrent Mode Failure가 발생하면, JVM은 현재 진행 중인 Concurrent GC를 중단하고 애플리케이션 스레드를 STW 시킨 상태에서 강제로 Full GC를 수행


4. G1 GC (Garbage-First)

  • 특징: 하드웨어 발전과 대규모 힙 메모리 환경에 적합하도록 설계된 GC이다. CMS GC를 대체하기 위해 나왔으며, 짧은 STW 시간과 충분한 처리량이라는 두 마리 토끼를 잡는 것을 목표로 한다. Java 9부터 기본 GC로 채택되었다.

  • 힙 영역 관리: 기존 Young/Old 영역 방식을 유지하면서도, 힙을 동일한 크기의 여러 개의 Region으로 분할하여 관리한다. 각 Region은 Young 또는 Old 영역 역할을 유동적으로 수행할 수 있다.

  • 동작 방식 ("Garbage-First"): GC를 수행할 때, 가장 많은 가비지(Garbage)를 포함하고 있는 Region(즉, 회수했을 때 가장 많은 빈 공간을 얻을 수 있는 Region)부터 우선적으로 처리한다. 이 때문에 Garbage-First GC라고 불린다.

  • Mark/Sweep: Mark 단계는 CMS와 유사하게 Concurrent Mark 과정을 포함하지만, Region 단위로 살아있는 객체를 파악한다. Sweep 단계에서는 가비지가 많은 Region을 선택하여 해당 Region 내에서 객체를 회수한다.

  • Compact: 선택된 Region 내에서 살아있는 객체들을 다른 Region으로 이동(Evacuation)시키는 방식으로 Compact를 수행하여 메모리 단편화를 관리한다.

  • 장점: 대규모 힙에서도 효율적으로 동작하며, 예측 가능한 짧은 STW 시간을 제공한다. Throughput과 Latency 사이의 균형이 좋다. Region 단위 처리로 Full GC 발생 가능성을 줄인다.

  • 단점: 작은 힙에서는 Serial GC나 Parallel GC보다 성능이 떨어질 수 있다.


5. ZGC

  • 특징: 매우 짧은 STW 시간(10ms 미만)을 목표로 하는 확장성 높은 GC이다. 대규모 힙(수 TB) 환경에서도 일정한 STW 시간을 유지하는 데 강점을 가진다. Java 11부터 실험적으로 도입되었고, Java 15부터 Production 상태로 제공된다.

  • STW: 대부분의 GC 작업을 애플리케이션 스레드와 동시에(Concurrent) 수행하며, STW 구간은 매우 짧다 (GC Roots 스캔 등)이다.

  • 힙 영역 관리: G1처럼 힙을 Region(페이지)으로 분할하지만, Region 크기가 고정되어 있지 않고 가변적이다.

  • 핵심 기술: Colored Pointers 및 Load Barriers 기술을 사용하여 Concurrent 작업 중 객체 참조 변화를 효율적으로 추적하고 관리한다.

  • 장점: 매우 낮은 지연 시간(Latency)을 제공하여 실시간 서비스나 매우 큰 메모리를 사용하는 애플리케이션에 적합하다. 힙 크기가 커져도 STW 시간이 크게 늘어나지 않는다.

  • 단점: 비교적 최신 GC 알고리즘으로, 다른 GC에 비해 요구 사양이 높거나 특정 환경에서 특성을 이해하고 튜닝할 필요가 있다.

profile
컴퓨터를 좋아합니다

0개의 댓글