본문 바로가기

CS Study

8월 4주차 GC

 

 


공통 질문

1. JAR, WAR

2. JDK > JRE > JVM

3. GC


c언어에서는 메모리를 해제하는 명령어가 있다. 그러나 java에서는 이를 자동으로 해준다

 

Garbage Collection(GC)

  • 프로그램이 동적으로 할당했던 메모리 영역(Heap) 중 필요 없게 된 영역을 자동 해제
  • Java와 같은 언어에서 메모리 관리를 자동으로 처리 기법
  • 애플리케이션의 메모리에서 사용하지 않는 객체를 자동으로 찾아서 메모리를 회수

 

 

GC 동작 방법

  • 객체 생성
    • Java 애플리케이션에서 객체가 생성되면 JVM의 Heap 메모리에 할당
  • 객체 참조
    • 객체가 참조되면, GC는 이 객체를 "활성"으로 간주
  • 사용되지 않는 객체 식별
    • 애플리케이션 코드에서 객체에 대한 참조가 없어지면, GC는 이 객체를 "사용되지 않는 객체"로 간주하고 Heap 메모리에서 제거
  • 메모리 회수
    • GC는 사용되지 않는 객체를 찾아서 Heap 메모리에서 제거하고, 그 Heap 메모리 공간을 다시 사용

 

  

 

GC 발생 시점

  • 자동 발생
    • GC는 JVM이 자동으로 메모리 부족을 감지하거나 일정 주기로 발생시킴
  • 메모리 부족
    • Heap 메모리가 가득 차면 GC가 발생하여 Heap 메모리를 회수
  • 특정 메서드 호출
    • 애플리케이션 코드에서 직접 System.gc()를 호출하면 GC를 유도할 수 있지만, 이는 권장되지 않습니다.

 

 

 


 

JVM에서 GC

GC 방식의 발전

  • Java 6: 기본 GC는 Serial GC, Parallel GC, CMS GC 등이 지원
  • Java 7: G1GC가 도입되어, 보다 세밀한 메모리 관리와 정지 시간 예측을 지원
  • Java 11: ZGC가 도입되어, 낮은 정지 시간을 제공하며 대규모 힙을 지원
  • Java 12: Shenandoah GC가 도입되어, 낮은 정지 시간을 지원

1. 기본 GC 알고리즘

  • Mark and Sweep
    • 초기 JVM에서는 Mark and Sweep 방식이 기본으로 사용되었습니다.
    • 이 방식은 사용 중인 객체를 마킹하고, 사용되지 않는 객체를 스윕(제거)하는 과정으로 구성됩니다.
    • 간단하지만, 종종 긴 정지 시간을 유발할 수 있습니다.
    • Mark Phase: 모든 활성 객체를 마킹합니다.
    • Sweep Phase: 마킹되지 않은 객체를 메모리에서 제거합니다.
  • Mark and Compact: Mark and Sweep의 변형으로, 스윕 후에 메모리를 컴팩트하여 메모리 단편화를 줄입니다.

 

 
 
 

2. Generational Garbage Collection

  • Young Generation and Old Generation
    • Generational Garbage Collection은 객체의 수명에 따라 메모리를 젊은 세대와 오래된 세대로 나누어 관리합니다.
    • 새로 생성된 객체는 젊은 세대에서 관리되고, 오래된 객체는 오래된 세대에서 관리됩니다.
    • 이 방식은 대부분의 GC 알고리즘에서 사용됩니다.
    • Young Generation: 짧은 생애를 가진 객체들을 위한 메모리 공간. Minor GC가 여기에 대해 발생합니다.
    • Old Generation: 더 오래 살아남은 객체들을 위한 메모리 공간. Major GC 또는 Full GC가 여기에 대해 발생합니다.

3. 주요 GC 알고리즘

  • Serial GC
    • 단일 스레드로 GC를 수행하는 간단한 방식입니다.
    • 작은 애플리케이션이나 단일 CPU 환경에서 유용합니다.

 

  • Parallel GC
    • 여러 스레드를 사용하여 GC를 병렬로 수행합니다.
    • 멀티코어 시스템에서 성능을 향상시킵니다.

 

  • Concurrent Mark-Sweep (CMS) GC:
    • Mark and Sweep을 확장하여 GC의 일부 작업을 애플리케이션 스레드와 동시에 수행합니다.
    • GC의 정지 시간을 줄이는 것을 목표로 합니다.
    • Initial Mark Phase: 빠르게 초기 마킹을 수행합니다.
    • Concurrent Mark Phase: 애플리케이션과 동시에 객체를 마킹합니다.
    • Remark Phase: 최종 마킹을 수행합니다.
    • Concurrent Sweep Phase: 객체를 제거합니다.
  • G1 Garbage Collector (G1GC)
    • Java 7에 도입된 현대적인 GC 알고리즘입니다.
    • 힙 메모리를 여러 개의 리전으로 나누어 관리하고, 성능과 정지 시간을 예측할 수 있습니다.
    • Young Generation and Old Generation: 각각의 리전에서 젊은 세대와 오래된 세대 객체를 관리합니다.
    • Mixed GC: 젊은 세대와 일부 오래된 세대를 동시에 수집합니다.

 

  • ZGC (Z Garbage Collector)
    • Java 11에서 도입된 GC 알고리즘으로, 매우 낮은 정지 시간과 대규모 힙을 지원합니다.
    • Region-based 구조와 비슷한 방식으로 동작하지만, 보다 낮은 정지 시간을 목표로 합니다.
  • Shenandoah GC
    • Java 12에서 도입된 GC로, ZGC와 유사한 목표를 가지고 있지만 다른 방식으로 구현되었습니다.
    • 정지 시간을 최소화하고, 대규모 힙을 지원합니다.

 

GC 알고리즘의 발전 이유

  • 성능 향상: 현대의 GC 알고리즘은 정지 시간을 줄이고, 멀티코어 CPU 환경에서의 성능을 극대화하기 위해 개발되었습니다.
  • 예측 가능성: G1GC와 ZGC, Shenandoah GC는 예측 가능한 정지 시간을 제공하여 애플리케이션의 응답성을 개선합니다.
  • 대규모 힙 지원: ZGC와 Shenandoah GC는 대규모 힙을 효과적으로 지원하여 메모리 사용을 최적화합니다.

GC 튜닝과 G1GC

  • G1GC의 설계: G1GC는 메모리를 여러 리전으로 나누어 관리하며, 자동으로 메모리를 정리할 수 있도록 설계되었습니다. 리전 기반의 메모리 관리와 동시성 GC 작업으로 인해, GC 튜닝의 필요성이 줄어들었습니다.
  • 리전 기반 관리: 메모리를 리전으로 나누어 관리함으로써, G1GC는 정지 시간의 예측과 조정이 용이하며, 전체 힙의 동시 GC를 줄일 수 있습니다. 이는 GC 튜닝의 복잡성을 감소시키고, 시스템 성능을 안정화하는 데 기여합니다.

요약

  • JVM에서의 GC 방식:
    • JVM은 다양한 GC 알고리즘을 제공하며, Java 버전별로 발전해왔습니다.
    • 초기에는 Mark and Sweep 방식이 기본이었으나,
    • 현재는 G1GC, ZGC, Shenandoah GC와 같은 고급 알고리즘이 사용됩니다.
  • GC 튜닝의 목표
    • 성능 최적화, 정지 시간 최소화, 메모리 사용 효율성 증대.
  • G1GC의 이점
    • 리전 기반 관리로 GC 성능과 예측 가능성을 향상시키며, 튜닝의 필요성을 줄입니다.

 

 

G1 Garbage Collector (G1GC)

G1GC의 특징

  • 리전(Region) 기반 관리
    • G1GC는 Heap 메모리를 여러 개의 리전(Region)으로 나누어 관리합니다.
    • 각 리전은 서로 다른 크기와 용도로 사용될 수 있으며, 이로 인해 메모리의 효율적인 관리와 회수 가능
  • 동시성
    • G1GC는 애플리케이션의 정지 시간을 줄이기 위해 여러 스레드를 사용하여 GC를 수행
  • 예측 가능성
    • G1GC는 정지 시간 목표를 설정할 수 있어, 정지 시간 예측 용이

G1GC의 GC 튜닝 수고를 덜어주는 이유

  • 리전 기반 관리
    • 메모리를 리전으로 나누어 관리함으로써, G1GC는 메모리 회수 작업을 더 세밀하게 조정할 수 있습니다. 이를 통해 전체 힙 메모리의 동시 GC를 줄이고, 필요한 리전만을 대상으로 GC를 수행합니다.
  • 동적 조정
    • G1GC는 GC의 성능과 정지 시간을 동적으로 조정할 수 있습니다. 이는 시스템의 상태와 요구에 따라 GC의 동작을 최적화합니다.
  • 예측 가능한 정지 시간
    • G1GC는 정지 시간 목표를 설정하여 애플리케이션의 응답성을 일정 수준으로 유지할 수 있습니다.
    • 이는 GC 튜닝의 복잡성을 줄이고, 예측 가능한 성능을 제공합니다.

 

 
   

 

 

 

 

 
   
 
   

 

 

 

GC 튜닝의 궁극적인 목표

  • 성능 최적화: GC 튜닝의 주요 목표는 애플리케이션의 성능을 향상시키는 것입니다. GC가 너무 자주 발생하면 애플리케이션의 성능이 저하될 수 있습니다.
  • GC 지연 최소화: GC는 애플리케이션의 실행을 중단할 수 있습니다. 이를 최소화하여 애플리케이션의 응답성을 유지하는 것이 목표입니다.
  • 메모리 사용 효율성: 메모리 회수를 효율적으로 수행하여 메모리 부족 문제를 방지합니다.

 

 

  • 개발자가 메모리에 대해 신경을 덜 쓸 수 있어서 편해지는데, 그에 따른 단점은 없을까요?
  • 개발자가 GC 튜닝을 하는 궁극적인 목표는 무엇일까요?
    • G1GC부터는 GC튜닝에 크게 손이 가진 않는데, G1GC는 어떻게 만들었길래 개발자가 튜닝을 이전보다 덜 해도 되는걸까요?
    • 리전으로 구성된 구조가 왜 튜닝의 수고를 덜어주는걸까요?

 

 

이미지 출처
https://www.youtube.com/watch?v=FMUpVA0Vvjw&t=42s
https://www.youtube.com/watch?v=8JrciOSL3Gk
https://www.youtube.com/watch?v=jXF4qbZQnBc

 

 

 

'CS Study' 카테고리의 다른 글

8월 4주차 JDK, JRE, JVM  (0) 2024.08.19
8월 4주차 jar, war  (0) 2024.08.19
8월 3주차  (0) 2024.08.12
8월 2주차 - 개인 질문  (0) 2024.08.05
8월 2주차 - 공통 질문  (0) 2024.08.05