런타임 데이터 영역(Runtime Data Area)

이지호·2021년 11월 25일
0
post-thumbnail

Runtime Data Area란

자바 어플리케이션을 실행하기 위한 메모리 공간을 의미한다.

어플리케이션을 시작하면 JVM이 기동되면서 시작 클래스의 바이트코드를 읽어서 JVM의 메모리에 쓰는데, 이 메모리를 Runtime Data Area라는 부르는 몇 가지 영역에 나눠서 관리한다.

Runtime Data Area의 구성요소


런타임 데이터 영역은 JVM스펙에 따르면

  • PC 레지스터
  • JVM 스택
  • 메소드 영역
  • 런타임 상수 풀
  • 네이티브 메소드 스택
    으로 구분되어있다.

6가지 영역들은 같은 단위가 아니라 2가지 단위로 나누어 진다.
하나는 JVM단위, 나머지 하나는 Thread단위이다.

JVM 단위


JVM단위는 JVM이 시작될 때 단 하나만 생성되며, 모든 스레드들이 공유한다.

Heap

힙 영역은 모든 클래스 인스턴스와 Array객체같이 긴 생명주기를 가진 데이터들이 저장되는 공간이다.
Heap의 메모리 해제는 오직 Garbage Collector 의해 수행된다.
또한 모든 스레드들이 공유하는 영역이라 Race Condition을 유발할 수 있다.

Method Area

메서드 영역은 클래스 로더에 의해 로드 된 클래스 정보를 맨 처음 메모리 공간에 올릴 때, 초기화 되는 대상을 저장하는 공간이다. 런타임 상수 풀 그리고 그림에는 안나와 있지만 필드, 메서드, 생성자, 데이터 등의 코드 내용으로 이루어져 있다.

Runtime Constant Pool

런타임 상수풀은 메서드 영역에 클래스가 정보가 로드될 때 생성된다.
런타임 상수 풀에는 런타임에 해석되는 메서드와 필드의 참조 등 여러 종류의 상수가 저장되어있다.

Thread 단위

PC Register

PC Register는 스레드가 생성될 때마다 생기는 공간으로 스레드가 현재 실행중인 명령을 저장하는 역할을 한다.

JVM Stack

JVM Stack은 JVM Frame을 저장하는 역할을 한다.
Stack의 메모리 크기는 고정크기와 가변크기가 있다.

JVM Frame

JVM Frame은 메소드가 호출될 때마다 생성되며, 메소드의 상태정보를 저장한다.
Frame읜 구성요소는 총 3가지로 다음과 같다.

  • Local Variables
  • Operand Stack
  • Constant Pool Reference

Local Variables

Local Variables의 크기는 컴파일 타임에 결정되며, 자바 바이트 코드에서 Code속성에 locals로 표현된다.

long, double은 2개의 슬롯을 차지하지만,
boolean, byte, char, short, int float, reference, retrunAddress는 1개의 슬롯을 차지한다.
메서드가 호출될 때 해당 메서드의 파라미터 값은 Local Variables를 통해 넘겨진다.

만약 호출되는 메서드가 클래스 메서드일 경우에는 메서드의 첫번째 파라미터는 Local Variables의 0번째 index에 저장되면 이후 차례대로 저장된다.

반대로 메서드가 인스턴스 메서드일 경우에는 this가 Local Variables의 0번째 index에 저장되고 이후 메서드의 파라미터가 차례대로 저장된다.

Operand Stack

Operand Stack의 크기 또한 Local Variables처럼 컴파일 타임에 결정되며, 자바 바이트 코드에서 Code속성에 stack으로 표현된다.

Operand Stack은 프레임이 생성될 당시에는 비어있으며, 메소드 내 계산 과정 등 모든 과정에서 이용된다.

Constant Pool Reference

Constant Pool Reference 영역은 해당 프레임과 대응되는 메소드가 속한 클래스 단위의 런타임 상수풀에 대한 참조를 의미한다.

Native Method Stack

Native Method Stack은 자바가 아닌 다른 언어로 작성된 네이티브 메서드를 지원하기 위한 스택이다.

0개의 댓글