본문 바로가기
Language/☕️Java

JVM 아키텍처 2탄 - 런타임 데이터 영역(Run-time Data Area)

by 발개발자 2022. 8. 31.
반응형

간만에 JVM 아키텍쳐 2탄을 작성하는 것 같다...

한동안 대충 슥 보고 JVM을 이해했다 생각하여 게시글 작성도 안한 것에 대해 반성하며 글을 시작한다.

 

 

런타임 데이터 영역은 5개의 주요 구성 요소로 나뉜다.

 

  메서드 영역(Method Area)

 

클래스가 사용될 때 JVM은 해당 클래스 파일을 읽고 분석하여, Static 변수를 포함하여 런타임상수풀, 필드, 메서드 데이타, 메서드 코드, 생성자와 같이 모든클래스 수준의 데이터를 메서드영역에 저장한다. JVM당 하나의 메서드 영역만 있으며 공유자원에 속하기 때문에 모든 스레드가 접근할  있다. 

 

아래 어떤 정보를 저장하는지 디테일하게 알아보자.

 

  Type Information

  •  Type(class or interface)의 전체 이름
  •  Type의 직계 하위 클래스 전체 이름
  •  Type의 class/interface 여부
  •  Type의 modifier (public / abstract / final)
  •  연관된 interface 이름 리스트

 

  Filed Information

  •  Field Type
  •  Field Modifier (public / private / protected / static / final / volatile / transient)

 

  Method Information

  • 생성자를 포함한 모든 Method의 메타 데이터를 저장

 

  Runtime Constant Pool

  •  Type, Field, Method로의 모든 레퍼런스를 저장
  •  JVM은 이 영역을 통해 실제 메모리 상의 주소를 찾아 참조

 

  Class Variable

  •  static 키워드로 선언된 변수를 의미
  •  기본형이 아닌 static 변수는 레퍼런스 변수만 저장되고 실제 인스턴스는 Heap에 저장
  •  클래스를 사용하기 이전에 이 변수들은 미리 메모리를 할당

 

new로 인스턴스를 생성하기 전에 코드는 텍스트일 뿐이며, 객체 생성 후에 메소드를 실행할 때 해당 클래스 코드에 대한 정보를 메서드영역에 저장하게 된다.

여기서, 메서드 영역에서 메모리가 부족하면 OutOfMemoryError 발생한다.

 

 

 

  힙 영역(Heap Area)

 

원시타입이 아닌 데이터들이 저장되는 영역이다. 즉, 인스턴스와 배열이 동적으로 생성되는 공간으로 JVM은 미리 Heap영역을 크게 할당해 놓으며, 인스턴스와 인스턴스 변수를 저장한다. 레퍼런스 변수의 경우 Heap에 인스턴스가 저장되는것이 아니라 포인터로 저장하며, Heap에 쌓인 데이터들은 Garbage Collection의 대상이 된다. 따라서, 개발자가 객체를 제거하기 위해 별도의 코드를 작성할 필요가 없는 것 이다.

 

JVM당 하나의 힙영역만 있으며, 공유자원에 속하기 때문에 동기화 문제가 발생할 수 있으며,

힙영역에서 메모리가 부족하면 OutOfMemoryError 발생한다.

 

 

  JVM Stacks 

Thread가 생성될 때 마다 별도의 런타임 스택이 생성된다. 단일 Thread당 Method가 호출될 때 수행정보 (메서드 호출 주소, 매개 변수, 지역변수, 연산 스택 등)이 Frame 이라는 단위로 JVM Stack에 저장된다. 그리고 Method 호출이 종료될 때 Stack에서 제거된다. 

 

스택 프레임은 세 개의 하위 엔티티로 나뉜다.

  지역 변수 배열 

메서드의 지역변수를 배열 형태로 저장한다. 원시 타입의 값은 스택에 같이 저장되고, 레퍼런스 타입은 실제 값은 힙영역에 있고 그 힙영역의 주소값을 스택에 저장한다.

 

  Operand stack

계산을 위한 입출력 데이터를 저장하는 공간이다.

 

  프레임 데이터

프레임마다 런타임상수풀(Run-time constant poo) 레퍼런스를 포함하고 있다. 심볼릭 링크 형태의 메서드/변수를 참조하는 경우 런타임상수풀을 참조하여 실제 로드된 스트럭처의 오프셋 형태로 변환한다. 런타임상수풀을 사용함으로써 동적 로딩이 가능해진다.

 

스택 영역은 공유 리소스가 아니므로 다른 스레드의 스택영역엔 접근   없어 스레드로부터 안전하다.

 

 

 

  PC 레지스터 

 

CPU 내의 기억장치인 레지스터와는 다르게 작동한다(Register-Base가 아닌 Stack-base로 작동).

각 스레드마다 별도의 PC 레지스터가 있으며, 명령이 실행되면 현재 실행중인 명령의 주소(JVM Instruction)를 기록한다.

Stack에서 Operand를 뽑아내 이를 별도의 메모리 공간에 저장하는 방식을 취하는데, 이러한 메모리 공간을 PC Registers라고 한다.

 

 

  네이티브 메소드 스택

 

자바 이외의 언어로 작성된 네이티브 코드들의 Method 정보가 저장 되는 공간.

ex) JNI를 통해 호출되는 C/C++ 등의 코드.

ex) Thread.currentThread()

 

 

참조

 

JVM의 Runtime Data Area · 안녕 프로그래밍 (holaxprogramming.com)

자바 메모리 구조(Runtime Data Area) :: 찐코딩노예 (tistory.com)

[JVM] 런타임 데이터 영역(Run-time Data Area) :: 기록 그리고 기록 (tistory.com)

반응형

댓글