Post

⚡ Java - JVM 메모리 구조와 GC의 동작 원리

⚡ Java - JVM 메모리 구조와 GC의 동작 원리

🔹 JVM 메모리 구조

  • JVMJava 애플리케이션 실행을 위해 여러 메모리 영역을 나눠 관리한다.

▫️ 메서드 영역(Method Area)

  • 클래스의 구조 정보, static 변수, 상수 풀 등이 저장
  • 모든 스레드가 공유
  • JDK 8 이후로는 Metaspace로 대체

▫️ 힙 영역(Heap)

  • 객체가 생성되는 공간
  • GC의 주요 대상
  • Young 영역과 Old 영역으로 나뉨

▫️ 스택 영역(JVM Stack)

  • 메서드 호출 시 생성되는 프레임 저장
  • 지역 변수, 매개변수, 리턴 값 등 저장
  • 각 스레드마다 독립적으로 존재

▫️ PC 레지스터, 네이티브 메서드 스택

  • 각각의 스레드가 실행 중인 명령어 주소 저장
  • C/C++로 작성된 native 코드 실행에 사용

🔹 힙 영역의 세분화

▫️ Young Generation

  • 새로 생성된 객체가 저장되는 공간
  • Eden 영역 + 두 개의 Survivor 영역(S0, S1)으로 구성
  • 대부분의 객체는 이 영역에서 생성되고 소멸됨

▫️ Old Generation

  • Young 영역에서 살아남은 객체가 이동
  • 비교적 수명이 긴 객체가 존재
  • GC 발생 빈도는 낮지만, 한번 발생하면 비용이 큼

🔹 GC의 기본 원리

  • GC(Garbage Collection)는 더 이상 사용되지 않는 객체를 탐지하고 제거하여 메모리를 회수하는 기능이다.

▫️ 참조 체계

  • 객체가 다른 객체에 의해 참조되지 않을 때 GC 대상이 됨
  • JVM은 참조 그래프 기반으로 객체 생존 여부를 판단

🔹 GC 알고리즘 종류

▫️ Mark and Sweep

  • 사용 중인 객체를 표시(mark)
  • 미사용 객체를 제거(sweep)
  • 단점: 메모리 단편화 발생 가능

▫️ Copying

  • 살아있는 객체를 새로운 공간으로 복사
  • 복사 후 전체 메모리 정리
  • Young 영역에서 자주 사용(Minor GC)

▫️ Mark-Compact

  • Mark and Sweep 이후, 살아있는 객체를 한쪽으로 몰아서 압축
  • 단편화 문제 해결
  • Old 영역에서 사용(Major GC)

▫️ Generational GC

  • 객체의 생존 기간에 따라 YoungOld로 나누어 관리
  • 대부분의 객체는 생성 후 금방 사라진다는 가정에 기반

🔹 GC의 종류(JVM 구현 기준)

▫️ Serial GC

  • 단일 스레드로 GC 수행
  • 단순 구조, 작은 애플리케이션에 적합

▫️ Parallel GC

  • 여러 스레드로 Young 영역 GC 수행
  • Throughput 위주

▫️ CMS(Concurrent Mark-Sweep)

  • GC 작업을 애플리케이션 실행과 병행 수행
  • Stop-The-World 시간이 짧음
  • 단점: 메모리 단편화 가능

▫️ G1 GC (Garbage First)

  • Young, Old를 구분하지 않고 Region 단위로 메모리 관리
  • 예측 가능한 GC 시간 제공
  • JDK 9부터 기본 GC

🔹 Minor GC vs Major GC

구분Minor GCMajor GC(Full GC)
대상Young 영역Old 영역 전체
속도빠름느림
발생 빈도자주드묾 (하지만 비용 큼)
Stop-the-World발생함발생함

🔹 GC 튜닝 시 고려 사항

  • 애플리케이션의 메모리 사용 패턴 파악이 중요
  • Throughput 우선인지, 응답 시간 우선인지에 따라 GC 선택 달라짐
  • GC 로그 분석, -Xmx, -Xms, -XX:+UseG1GC 등의 옵션 사용

🔹 정리

  • JVMGC는 객체의 생애주기를 관리하여 메모리 누수를 방지하고, 안정적인 메모리 사용을 보장한다.
  • GC 알고리즘의 원리와 JVM 내부 구조를 함께 이해하면, 성능 튜닝이나 장애 분석에 효과적으로 대응할 수 있다.
This post is licensed under CC BY 4.0 by the author.