본문 바로가기
  • alert("Rocomi의 개발공부 블로그")
JAVA 공부

가비지 컬렉터(Garbage Collector, GC)

by Rocomi 2024. 7. 5.

가비지 컬렉터(Garbage Collector, GC)는 메모리 관리의 핵심 요소로, 사용하지 않는 객체를 자동으로 식별하고 회수하여 메모리 누수를 방지하는 역할을 합니다. 이 시스템 덕분에 개발자는 메모리 관리에 대해 걱정할 필요 없이 프로그램을 작성할 수 있습니다. 자바의 GC는 다양한 방식으로 동작하며, 여러 종류가 있습니다. 여기서는 GC의 기본 개념과 자바에서 사용되는 주요 GC 유형들, 그리고 각각의 특징을 상세히 설명합니다.

가비지 컬렉터의 기본 개념

1. 힙 메모리

  • 자바의 메모리는 주로 힙(Heap) 메모리와 스택(Stack) 메모리로 나뉩니다.
  • 힙 메모리는 모든 클래스 인스턴스와 배열이 동적 할당되는 곳입니다.
  • 스택 메모리는 메서드 호출과 로컬 변수 저장에 사용됩니다.

2. 객체의 생명주기

  • 객체는 힙 메모리에 생성되며, 더 이상 참조되지 않을 때 가비지 컬렉터에 의해 회수됩니다.
  • 참조되지 않는 객체는 가비지(쓰레기)로 간주됩니다.

3. 가비지 컬렉션의 과정

  • 마크 단계: 가비지 컬렉터가 루트(root)부터 시작하여 모든 접근 가능한 객체를 식별합니다.
  • 스위프 단계: 접근할 수 없는 객체를 메모리에서 제거합니다.
  • 압축 단계(선택 사항): 메모리 단편화를 줄이기 위해 남은 객체들을 하나로 모읍니다.

자바의 주요 가비지 컬렉터 종류

자바는 다양한 GC 알고리즘을 제공합니다. 각 알고리즘은 다른 방식으로 메모리를 관리하며, 특정 시나리오에 최적화되어 있습니다.

1. Serial GC

  • 설명: 단일 스레드로 동작하는 GC입니다.
  • 특징: 간단하고 효율적이며, 작은 애플리케이션이나 단일 스레드 환경에 적합합니다.
  • 명령어: -XX:+UseSerialGC

2. Parallel GC

  • 설명: 여러 스레드를 사용하여 GC 작업을 병렬로 수행합니다.
  • 특징: 멀티코어 시스템에서 더 나은 성능을 발휘하며, 고성능 애플리케이션에 적합합니다.
  • 명령어: -XX:+UseParallelGC

3. CMS (Concurrent Mark-Sweep) GC

  • 설명: 애플리케이션 실행 중에 대부분의 GC 작업을 병렬로 수행합니다.
  • 특징: 짧은 멈춤 시간을 목표로 하며, 대화형 애플리케이션에 적합합니다.
  • 명령어: -XX:+UseConcMarkSweepGC
  • 단점: 메모리 단편화 문제와 높은 CPU 사용률이 발생할 수 있습니다.

4. G1 (Garbage-First) GC

  • 설명: 자바 7부터 도입된 GC로, 힙을 여러 영역으로 나누어 관리합니다.
  • 특징: 예측 가능한 멈춤 시간을 제공하며, 대용량 힙 메모리에 적합합니다.
  • 명령어: -XX:+UseG1GC

5. ZGC (Z Garbage Collector)

  • 설명: 매우 낮은 멈춤 시간을 목표로 하는 최신 GC입니다.
  • 특징: 매우 큰 힙(수 테라바이트)에서 작동할 수 있으며, 멈춤 시간이 10ms 미만입니다.
  • 명령어: -XX:+UseZGC
  • 제한: 최신 자바 버전에서만 사용 가능하며, 현재는 실험적인 기능입니다.

6. Shenandoah GC

  • 설명: Red Hat이 개발한 낮은 멈춤 시간 GC입니다.
  • 특징: 병렬로 메모리를 정리하며, 낮은 멈춤 시간을 목표로 합니다.
  • 명령어: -XX:+UseShenandoahGC

GC 튜닝과 모니터링

1. GC 튜닝

  • 애플리케이션의 성능을 최적화하기 위해 GC 설정을 조정할 수 있습니다.
  • 예를 들어, 힙 크기(-Xms와 -Xmx), 영세대와 노년세대 크기, GC 스레드 수 등을 조정할 수 있습니다.

2. GC 모니터링

  • 자바는 다양한 도구를 제공하여 GC 동작을 모니터링할 수 있습니다.
  • VisualVM: 자바 애플리케이션의 성능을 모니터링하고 분석하는 데 사용됩니다.
  • JConsole: JVM의 성능 데이터를 실시간으로 모니터링할 수 있습니다.
  • GC 로그: GC 로그를 통해 GC 이벤트를 분석할 수 있습니다. GC 로그를 활성화하려면 다음과 같은 JVM 옵션을 사용할 수 있습니다:
1
2
-Xlog:gc*:file=gc.log:time,uptime:filecount=5,filesize=10M
 
cs

자바의 가비지 컬렉터는 메모리 관리를 자동화하여 개발자의 부담을 덜어줍니다. 다양한 GC 알고리즘을 제공하여 애플리케이션의 특성과 요구에 맞게 선택할 수 있으며, 성능 튜닝과 모니터링 도구를 통해 최적의 성능을 달성할 수 있습니다. GC에 대한 깊은 이해는 고성능 자바 애플리케이션을 개발하는 데 중요한 요소입니다.

'JAVA 공부' 카테고리의 다른 글

입출력 IO 와 NIO(New IO)  (2) 2024.07.05
기본 API  (0) 2024.07.05
클래스 다이어그램  (0) 2024.07.01
다형성  (0) 2024.06.26
상속관계  (0) 2024.06.25