25.01.24 TIL Garbage Collector

신성훈·2025년 1월 24일
0

TIL

목록 보기
126/162

1. Garbage Collector(GC)란?

Garbage Collector(GC)는 프로그래밍 언어에서 더 이상 사용되지 않는 메모리를 자동으로 해제해주는 기능입니다.
개발자가 직접 메모리를 관리하지 않아도 불필요한 객체를 식별하고 메모리를 회수하여 메모리 누수를 방지합니다.
Java에서는 JVM(Java Virtual Machine)이 힙 메모리 관리를 위해 GC를 실행합니다.


2. Garbage Collector의 주요 원리

  1. 힙 메모리 구조

    • Java의 힙 메모리는 크게 다음과 같은 영역으로 나뉩니다:
      • Young Generation: 새롭게 생성된 객체가 저장
      • Old Generation: 오래된 객체가 저장
      • Permanent Generation(Metaspace): 클래스 메타데이터가 저장
  2. GC의 동작 과정

    • Young GC (Minor GC)
      • Young Generation에서 사용되지 않는 객체를 제거
    • Old GC (Major GC)
      • Old Generation에서 불필요한 객체를 제거
    • Full GC
      • 힙 전체(Young + Old Generation)에서 메모리를 정리
  3. 객체의 생존 주기

    • 새로 생성된 객체 → Young Generation(Eden 영역)
    • Young GC를 통해 생존한 객체 → Survivor 영역 → Old Generation

3. Garbage Collector의 종류

  1. Serial GC

    • 단일 스레드로 동작
    • 작은 애플리케이션에 적합
  2. Parallel GC

    • 다중 스레드로 동작하여 속도 향상
    • 멀티코어 환경에 적합
  3. CMS (Concurrent Mark-Sweep) GC

    • 애플리케이션 멈춤 시간을 줄이기 위해 병렬 처리를 수행
    • 낮은 레이턴시가 필요한 애플리케이션에 적합
  4. G1 (Garbage First) GC

    • 영역을 작은 단위(Region)로 나누어 관리
    • 대규모 애플리케이션에서 높은 성능 제공

4. Garbage Collector의 특징

  1. 자동 메모리 관리

    • 객체의 생명주기를 관리하며, 메모리를 자동으로 회수
  2. Stop-The-World (STW)

    • GC 실행 시 애플리케이션 실행이 일시적으로 중단됨
    • GC 최적화를 통해 STW 시간을 최소화하는 것이 중요
  3. Generational GC

    • 객체를 세대(Generation)별로 관리하여 효율성을 높임

5. JVM에서 GC 튜닝

GC 튜닝은 메모리 할당과 회수의 효율성을 높이고, 애플리케이션 성능을 최적화하는 데 중요합니다

  1. JVM 옵션으로 GC 종류 설정

    -XX:+UseG1GC
    -XX:+UseParallelGC
    -XX:+UseSerialGC
  2. 힙 메모리 크기 조정

    -Xms512m -Xmx1024m
  3. GC 로그 활성화

    -XX:+PrintGCDetails -XX:+PrintGCDateStamps
  4. Full GC 최소화

    • 객체 생명주기를 분석하여 Old Generation으로 이동을 줄임

6. GC의 장점과 단점

장점

  1. 메모리 누수 방지
  2. 개발자의 부담을 줄여 생산성 향상
  3. 메모리 관리를 자동화하여 안정성 확보

단점

  1. GC 실행 시 애플리케이션이 멈출 수 있음(STW)
  2. GC 과부하가 발생하면 성능 저하
  3. 특정 애플리케이션에서는 수동 메모리 관리보다 효율이 떨어질 수 있음

7. GC 사용 예시

객체 생성 및 메모리 관리

public class GarbageCollectorExample {
    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            String data = new String("Garbage Collection Example " + i);
        }
        System.gc(); // Garbage Collection 요청
    }
}

GC 로그 확인 옵션

java -XX:+PrintGCDetails -XX:+PrintGCDateStamps GarbageCollectorExample

8. 마무리

Garbage Collector는 Java의 메모리 관리를 자동화해주는 강력한 도구입니다.
GC의 원리를 이해하고 프로젝트 특성에 맞는 GC를 선택하여 성능을 최적화하는 경험이 중요하다고 느꼈습니다.
G1 GC와 같은 최신 GC는 대규모 애플리케이션에서도 효율적인 메모리 관리를 하는 것을 알게 되었습니다.
GC 튜닝을 통해 Stop-The-World 시간을 줄이는 기술적인 접근의 필요성을 실감했습니다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글