본문 바로가기

JAVA

[JAVA] JVM GC(Garbage Collection)이란 무엇인가? 대표 알고리즘 알아보기!

728x90
반응형

JVM GC(가비지 컬렉션)의 개념

**가비지 컬렉션(GC)**는 JVM(Java Virtual Machine)이 동적으로 할당된 메모리 중 더 이상 사용되지 않는 객체를 자동으로 식별하고 회수하는 메커니즘입니다. 이는 개발자가 명시적으로 메모리를 해제하는 번거로움을 덜어주며, 메모리 누수를 방지합니다.

주요 개념과 단계

출처 : https://devocean.sk.com/blog/techBoardDetail.do?ID=165630&boardType=techBlog

  1. 힙(Heap) 메모리 관리
    • JVM의 힙은 크게 Young Generation, Old Generation, 그리고 Permanent Generation (또는 Metaspace)으로 나뉩니다.
    • Young Generation: 새로 생성된 객체가 저장되는 공간. 대부분의 객체는 여기에 생성되며, 수명이 짧습니다.
    • Old Generation: Young Generation에서 살아남은 객체들이 이동되는 공간. 오래된 객체들이 저장됩니다.
    • Metaspace: 클래스 메타데이터를 저장하는 공간(Java 8 이후부터는 Permanent Generation 대신 사용).
    •  
  2. GC의 주요 단계
    • 마크(Mark): 사용 중인 객체를 식별합니다.
    • 스윕(Sweep): 사용되지 않는 객체를 제거합니다.
    • 압축(Compact): 남아있는 객체들을 힙의 시작 부분으로 이동하여 단편화를 방지합니다. 일부 GC 방식에서는 이 단계가 생략됩니다.

GC 알고리즘의 종류

  1. Serial GC: 단일 스레드로 GC 작업을 수행. 작은 애플리케이션에 적합.
  2. Parallel GC: 여러 스레드로 GC 작업을 병렬로 수행. 멀티 코어 시스템에서 효율적.
  3. CMS GC: 낮은 지연 시간(Low Latency)을 목표로 병행 마크-스윕을 수행. CPU 사용량이 높음.
  4. G1 GC: 힙을 작은 영역으로 나누어 관리. 예측 가능한 짧은 정지 시간을 제공.
  5. ZGCShenandoah GC: 매우 낮은 정지 시간을 목표로 설계. 대용량 힙에서 효과적.

GC 동작 방식

  • Minor GC: Young Generation에서 발생. 짧고 빈번하게 실행.
  • Major GC: Old Generation에서 발생. 상대적으로 긴 시간 동안 실행.

주요 GC 튜닝 옵션

  • -XX:+UseSerialGC: Serial GC 사용
  • -XX:+UseParallelGC: Parallel GC 사용
  • -XX:+UseConcMarkSweepGC: CMS GC 사용
  • -XX:+UseG1GC: G1 GC 사용
  • -XX:+UseZGC: ZGC 사용

JVM 튜닝과 모니터링

GC의 성능을 최적화하기 위해 힙 크기, Young/Old Generation 비율, 스레드 수 등을 조정할 수 있으며, VisualVM 같은 도구를 사용해 GC 활동을 모니터링하고 분석할 수 있습니다.

 

Java 가비지 컬렉션 (GC)의 종류와 특징

1. Serial GC

특징:

  • 단일 스레드로 작동하며 모든 GC 작업을 하나의 스레드가 수행합니다.
  • Stop-the-World(세상의 모든 작업을 멈춤) 이벤트가 발생하여 GC가 실행되는 동안 애플리케이션의 모든 작업이 중단됩니다.
  • 메모리 효율성이 높고, 설정 및 구현이 간단하지만 성능이 낮아 대규모 애플리케이션에는 부적합합니다. 적용:
  • 단일 프로세서 환경이나 작은 메모리 할당이 필요한 작은 애플리케이션에 적합합니다.

2. Parallel GC

특징:

  • 멀티 스레드를 사용하여 Minor GC를 병렬로 수행합니다.
  • Serial GC보다 빠르며, 여러 스레드를 통해 GC 작업을 병렬로 처리하여 성능을 향상시킵니다.
  • Java 8에서 기본 GC로 설정되어 있습니다. 적용:
  • 멀티 프로세서 환경에서 성능을 최적화하고자 할 때 적합합니다.

3. Parallel Old GC

특징:

  • Parallel GC의 개선된 버전으로, Major GC도 멀티 스레드로 병렬 처리합니다.
  • 큰 힙을 가진 애플리케이션에서 성능을 높일 수 있습니다. 적용:
  • 대규모 데이터 처리와 높은 성능이 요구되는 애플리케이션에 적합합니다.

4. CMS (Concurrent Mark-Sweep) GC

출처 : https://velog.io/@mirrorkyh/GC-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%A7%95

특징:

  • Stop-the-World 시간을 최소화하기 위해 GC 작업을 여러 단계로 나눠 병렬로 수행합니다.
  • Mark 단계에서 애플리케이션 스레드와 병행하여 살아있는 객체를 표시하고, Sweep 단계에서 불필요한 객체를 정리합니다.
  • CPU와 메모리 사용량이 많아지며, Java 14 이후로는 사용 중지되었습니다. 적용:
  • 낮은 지연 시간(Low Latency)이 중요한 애플리케이션, 예를 들어 실시간 시스템이나 사용자 인터페이스 중심의 애플리케이션에 적합합니다.

5. G1 (Garbage First) GC

출처 : https://velog.io/@mirrorkyh/GC-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%A7%95

특징:

  • 힙을 작은 영역으로 나누고, 가장 많은 가비지를 포함한 영역을 우선적으로 정리합니다.
  • Predictable Pause Times를 제공하여 짧은 Stop-the-World 시간을 보장합니다.
  • Young GenerationOld Generation을 분리하여 관리합니다. 적용:
  • 멀티 코어 CPU와 대용량 메모리 시스템에서 성능을 극대화하고자 할 때 적합합니다. 예를 들어, 대규모 엔터프라이즈 애플리케이션이나 서버 환경에서 사용됩니다.

이와 같은 GC 방식들은 각기 다른 환경과 요구 사항에 맞춰 다양한 선택지를 제공하며, 이를 통해 Java 애플리케이션의 메모리 관리를 최적화할 수 있습니다.

728x90
반응형