[Java] JVM Garbage Collection 구조와 Promotion(승격) 조건

2026. 2. 25. 10:57·Back end/Java
반응형

1. JVM Garbage Collection(GC)이란?

Garbage Collection(GC)은 자바의 메모리 관리 기법 중 하나로, 힙(Heap) 영역에서 더 이상 참조되지 않는 객체들을 찾아 메모리에서 해제하는 과정을 의미합니다. C나 C++ 과 달리 개발자가 직접 메모리를 해제할 필요가 없으며, JVM이 자동으로 관리해줍니다.

GC의 장점

  • 메모리 누수 방지: 프로그래머의 실수로 인한 메모리 누수를 자동으로 방지
  • 개발 생산성 향상: 메모리 관리에 신경 쓰지 않고 비즈니스 로직에만 집중
  • 안정성 보장: 메모리 부족으로 인한 프로그램 정지 위험을 감소

GC의 단점

  • GC 중단시간(Stop-The-World): GC 실행 중 모든 애플리케이션 스레드가 중단
  • 성능 저하: GC로 인한 CPU 사용률 증가
  • 예측 불가능성: GC 발생 시점을 미리 예측하기 어려움

 


2. JVM 힙 메모리 구조

JVM의 힙 영역은 객체의 생존 기간에 따라 크게 Young Generation과 Old Generation으로 나뉩니다.

┌─────────────────────────────────────────────────┐
│              JVM Heap 메모리                    │
├─────────────────────────────────────────────────┤
│                                                 │
│  ┌──────────────────────┐  ┌───────────────┐    │
│  │   Young Generation   │  │ Old           │    │
│  │   (Young Gen)        │  │ Generation    │    │
│  │                      │  │ (Old Gen)     │    │
│  │ ┌────────┐ ┌────────┐│  │               │    │
│  │ │ Eden   │ │Survivor││  │               │    │
│  │ │Space   │ │Spaces  ││  │               │    │
│  │ │        │ │S0 / S1 ││  │               │    │
│  │ └────────┘ └────────┘│  │               │    │
│  └──────────────────────┘  └───────────────┘    │
│                                                 │
└─────────────────────────────────────────────────┘

Young Generation (Young Gen)

  • 새로 생성된 객체들이 할당되는 영역
  • 전체 힙의 약 10-30% 차지
  • 대부분의 객체가 이 영역에서 사라짐
  • 세 개의 하위 영역으로 구성:
    • Eden Space: 새로운 객체가 생성되는 공간
    • Survivor Space 0 (S0): 첫 번째 생존자 영역
    • Survivor Space 1 (S1): 두 번째 생존자 영역

Old Generation (Old Gen)

  • Young Gen에서 오래 생존한 객체들이 이동하는 영역
  • 전체 힙의 약 60-90% 차지
  • GC가 덜 빈번하게 실행됨

3. Minor GC vs Major GC

GC는 발생하는 영역에 따라 크게 두 가지로 구분됩니다.

Minor GC

  • 발생 지점: Young Generation
  • 특징:
    • 객체가 처음 생성되는 Eden 영역이 꽉 차면 발생합니다.
    • 상대적으로 속도가 매우 빠릅니다.
    • 살아남은 객체는 Survivor 영역으로 이동하며, 이 과정을 반복하며 생존 기간을 기록합니다.

Major GC (Full GC)

  • 발생 지점: Old Generation
  • 특징:
    • Old 영역의 메모리가 부족해지면 발생합니다.
    • Minor GC보다 훨씬 오래 걸립니다.
    • Stop-the-world 현상이 발생하여, GC를 실행하는 스레드를 제외한 모든 애플리케이션 스레드가 중단됩니다.

4. Minor 영역에서 Major 영역으로의 승격(Promotion)

객체가 Young Generation에서 Old Generation으로 옮겨가는 과정을 Promotion(승격)이라고 부릅니다. 이 과정은 어떻게 결정될까요?

  1. Age bit의 누적: Young 영역의 Survivor 공간에서 객체가 살아남을 때마다 객체 헤더의 age 값이 1씩 증가합니다.
    • 새로운 객체 생성:
      ├─ Eden Space (Age: 0)
    • 1차 Minor GC 후:
      ├─ Survivor S0 (Age: 1) ← 살아남은 객체
    • 2차 Minor GC 후:
      ├─ Survivor S1 (Age: 2) ← S0에서 생존한 객체
    • 3차 Minor GC 후:
      ├─ Survivor S0 (Age: 3) ← S1에서 생존한 객체

      ...

    • Age >= Threshold (보통 15)에서:
      ├─ Old Generation ← 승격!

  2. MaxTenuringThreshold: JVM은 이 age 값이 특정 기준(Threshold)에 도달하면 해당 객체가 "오래 살아남을 객체"라고 판단합니다.
  3. 이동: 기준치를 넘긴 객체는 비로소 Old Generation으로 복사(Promotion)됩니다.

참고: 너무 큰 객체가 생성되어 Eden 영역에 담기지 않을 경우, 바로 Old 영역으로 할당되기도 합니다.


5. 결론

GC가 자동으로 메모리를 관리해 주지만, Major GC가 빈번하게 발생하거나 길어지면 서비스 응답 속도가 떨어지는 성능 저하를 초래합니다. 따라서 적절한 힙 크기 설정과 서비스 특성에 맞는 GC 알고리즘(G1, ZGC 등) 선택이 중요합니다.

 

반응형

'Back end > Java' 카테고리의 다른 글

[Java] JDBC의 Statement와 PreparedStatement  (2) 2026.01.22
AtomicInteger는 어떻게 동시성을 보장할까? - CAS 알고리즘 깊이 파헤치기  (0) 2026.01.14
[Java] static import 활용법  (0) 2025.07.07
[Java] 자바 데이터 타입 (기본형, 참조형)  (0) 2025.05.27
[Java] 상수(Constant)  (0) 2025.05.26
'Back end/Java' 카테고리의 다른 글
  • [Java] JDBC의 Statement와 PreparedStatement
  • AtomicInteger는 어떻게 동시성을 보장할까? - CAS 알고리즘 깊이 파헤치기
  • [Java] static import 활용법
  • [Java] 자바 데이터 타입 (기본형, 참조형)
Kim-SooHyeon
Kim-SooHyeon
개발일기 및 알고리즘, 블로그 운영에 대한 글을 포스팅합니다. :) 목표: 뿌리 깊은 개발자 되기
    반응형
  • Kim-SooHyeon
    soo_vely의 개발로그
    Kim-SooHyeon
  • 전체
    오늘
    어제
    • 분류 전체보기 (266)
      • AI (4)
      • 알고리즘 (108)
        • 자료구조 (3)
        • Java (104)
        • Python (1)
      • Back end (76)
        • Spring Project (28)
        • Java (24)
        • Kafka (1)
        • API (1)
        • Python (0)
        • Django (3)
        • Linux (1)
        • 서버 (2)
        • 에러로그 (11)
        • 부스트 코스 (1)
      • Front end (9)
        • HTML, CSS (4)
        • JavaScript (4)
        • JQuery (0)
      • 기타 프로그래밍 (4)
        • Android Studio (1)
        • Arduino (2)
        • Azure Fundamental(AZ-900) (1)
      • 개발도구 (24)
        • IntelliJ (2)
        • Git (12)
        • SVN (0)
        • Eclipse (2)
        • 기타 Tool (8)
      • Database (17)
        • Oracle (11)
        • MySQL (0)
        • H2 Database (3)
        • ORM & JPA (1)
      • 자격증 (10)
        • 컴활 1급 (7)
        • 컴활 2급 (2)
        • SQLD (1)
      • 기타 (14)
        • 블로그 운영 (6)
        • 문서 (1)
        • 기타 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    springboot
    배열
    Git
    Oracle
    오라클
    github
    알고리즘
    구현
    for문
    단계별풀기
    1차원 배열
    문자열
    백준알고리즘
    spring
    solved.ac
    jpa
    백준
    BOJ
    java
    백준 자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kim-SooHyeon
[Java] JVM Garbage Collection 구조와 Promotion(승격) 조건
상단으로

티스토리툴바