[Java] JVM Runtime Data Area

Woomin Wang ·2025년 4월 1일

[Java]

목록 보기
6/10
post-thumbnail

JVM과 Runtime Data Area

JVM(Java Virtual Machine)이란?

JVM은 자바 애플리케이션을 실행하는 가상 머신으로, 자바 코드를 바이트코드로 변환한 후 이를 실행하는 역할을 한다.

이 과정에서 JVM은 메모리를 효율적으로 관리하기 위해 Runtime Data Area라는 공간을 사용한다.

Runtime Data Area란?

Runtime Data Area는 JVM이 자바 프로그램 실행 중 사용하는 메모리 영역이다.

JVM의 Runtime Data Area는 다음과 같이 구성된다.

스택(Stack) 메모리

스택(Stack) 메모리

  • 메서드 호출 시 개별적인 스택 프레임이 생성되며, 실행이 종료되면 해당 스택 프레임이 자동으로 제거
  • 기본 타입의 값객체 참조 주소, 메서드의 지역 변수, 매개변수 등을 저장

< 스택 프레임 구조>

스택 프레임(Stack Frame)은 각 메서드 호출 시 생성되는 독립적인 메모리 블록이다. 메서드 실행 시 자신만의 스택 프레임을 생성하여, 실행이 끝나면 해당 프레임이 제거된다.

각 스택 프레임은 다음과 같은 영역으로 구성된다.

1. Local Variables
: 메서드 내에서 선언된 지역 변수매개변수가 저장되는 영역

  • 기본 타입 변수: 값 자체가 저장
  • 참조 타입 변수: 객체의 메모리 주소를 저장
  • 매개변수: 메서드 호출 시 전달되는 값 또는 참조를 저장

2. Operand Stack
: 메서드 실행 중 발생하는 연산을 위한 스택 구조로, 메서드가 수행하는 연산을 지원하는 임시 저장 공간

  • 피연산자: 연산이 필요한 값들 저장
  • 연산 결과: 메서드 내 연산의 결과 저장
  • Push/Pop 연산:연산을 위해 값을 Push/Pop

3. Frame Data
: 메서드 실행에 필요한 상태 정보예외 처리 정보를 저장하는 영역

  • 복귀 주소: 메서드 종류 후 돌아갈 주소 저장
  • 예외 처리 정보: 예외 발생 시 필요한 정보 저장

< 스택 메모리 동작 방식 >

  1. 메서드 호출: 새로운 메서드가 호출되면 스택 프레임이 생성되어 스택에 푸시

  2. Stack Frame 내부 처리:

  • 메서드의 지역변수, 매개변수가 저장
  • 연산을 수행하기 위한 Operand Stack이 생성
  • 메서드 실행에 필요한 상태 정보가 포함
  1. 스택 프레임 관리: 스택 프레임은 LIFO 방식으로 Push/Pop, 메서드 실행이 끝나면 해당 스택 프레임이 자동으로 제거

  2. 프로그램 종료 또는 상위 메서드로 반환: 모든 메서드가 종료되면 스택이 비워짐

< 스택 오버 플로우(Stack Overflow) >

스택은 고정된 크기의 메모리 영역을 사용한다. 이때 메서드 호출이 너무 깊어지거나 지나치게 많은 지역 변수를 할당하면 스택이 가득 차는 스택 오버 플로우가 발생한다.
Ex) 과도한 재귀 함수

힙(Heap) 영역

힙(Heap) 메모리

  • 동적으로 생성된 객체배열이 저장되는 메모리 영역
  • 프로그램 실행 중 필요에 따라 크기가 변할 수 있음
  • JVM의 Garbage Collector을 통해 자동 관리

< 힙 영역 동작 방식 >

  1. 객체 생성: new 키워드 등을 사용하여 객체를 생성하면 힙 영역에 할당

  2. 객체 참조: 스택에 있는 참조 변수를 통해 힙 영역의 객체를 접근

  3. Garbage Collector 관리: 사용되지 않는 객체는 자동으로 제거

< 힙 메모리 구성 요소 >

< Young Generation(Eden + Survivor)>

  • Eden 영역: 새롭게 생성된 객체가 먼저 할당되는 공간
  • Survivor 영역(S0, S1): Eden 영역에서 살아남은 객체가 이동하는 공간

< Minor GC >

  • Eden 영역이 꽉 차면 Minor GC가 발생
  • 불필요한 객체를 정리하고, 살아남은 객체는 Survivor 영역(S0, S1)으로 이동
  • S0과 S1은 교대로 사용되며, 하나의 영역에 객체가 복사된 후 다른 영역은 비어 있는 상태로 유지
  • 일정 시간이 지나도 살아남은 객체는 Old Generation으로 이동

< Old Generation >

  • Young Generation에서 여러 번 Minor GC를 거쳐 살아남은 객체가 이동하는 공간
  • Old Generation에 할당된 객체는 Minor GC의 대상이 아니며, Major GC(Full GC)를 통해 관리

< Major GC(=Full GC) >

  • Old Generation 내의 참조되지 않는 객체를 정리
  • Minor GCYoung Generation만 처리하는 반면, Full GCYoung Generation + Old Generation 모두 정리
  • Stop-the-world 현상 발생하여 애플리케이션 실행이 일시적으로 멈춤

< Stop-the-World >
Garbage Collection 중에 JVM의 모든 애플리케이션 스레드가 멈추는 현상이다.
Full GC가 발생하면 Old Generation의 객체를 정리하는 과정에서 모든 객체를 검사해야 하므로, GC 작업을 진행하는 동안 애플리케이션의 실행이 중지된다.

메서드(Method) 영역

메서드(Method) 영역
: 프로그램을 실행하는 데 필요한 공통 데이터를 관리하는 영역으로, 프로그램의 모든 영역에서 공유한다.

  1. 클래스 정보: JVM이 로드한 클래스의 구조클래스 이름, 메서드, 필드(변수), 상속 관계 등의 정보가 저장된다.
  1. static 영역: static 변수static 메서드가 저장되는 공간이다. static으로 선언된 변수와 메서드는 클래스 자체에 속하며, 클래스가 메모리에 로드될 때 한 번만 할당되고 모든 객체가 공유한다.
  1. 런타임 상수 풀: 프로그램이 실행되는 동안 상수 값(문자열 리터럴, 숫자 상수, final로 선언된 상수 등)을 저장하는 영역이다.
profile
Backend Developer

0개의 댓글