백엔드

런타임 데이터 영역

skgur07 2024. 8. 14. 10:13

자바 가상 머신 JVM의 런타임 데이터 영역은 자바 애플리케이션을 실행할 때 사용되는 데이터들이 저장되는 메모리 공간입니다. 런타임 데이터 영역은 크게 다섯 가지 영역으로 나뉘어집니다.

  • 메서드 영역 ( Method Area )
  • 힙 영역 ( Heap )
  • 스택 영역 ( Stack )
  • PC 레지스터 ( Program Counter Register )
  • 네이티브 메서드 스택 ( Native Method Stack )

여기서 또 크게 2가지로 나눌 수 있습니다. Thread를 공유하는 영역과 공유하지 않는 영역

  • Thread가 공유하지 않는 역영 ( Java )
    • PC 레지스터 영역
    • 스택 영역
    • 네이티브 메서드 스택
  • Thread가 공유하는 영역 ( Java )
    • 힙 영역
    • 메서드 영역 ( ~ Java 7 )
    • 메타스페이스 영역 ( Java 8 ~ )

✻ 스레드 :

하나의 프로세스 내에서 여러 개의 실행 흐름을 두어 작업을 효율적으로 처리하기 위한 모델입니다.

간단히 말해 프로세스 내에서 실행되는 더 작은 실행 단위입니다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 이 스레드들은 같은 메모리 공간을 공유합니다.

힙 영역


힙 영역은 모든 스레드가 공유하는 영역 중 하나로 애플리케이션에서 생성되는 모든 객체와 배열이 할당되는 메모리로 동적으로 할당하고 해제하는데 사용하는 메모리 영역입니다.

생성된 객체와 배열의 참조 값은 스택 영역의 변수나 다른 객체의 필드에 의해서만 핸들링될 수 있다고 합니다.

메서드 영역


메서드 영역은 JVM이 실행 중인 모든 클래스의 메타데이터 ( 클래스 정보 등 )과 같은 상수, static 변수 그리고 컴파일된 코드 ( 메서드 ) 등을 저장하는 메모리 영역입니다.

자바 프로그램이 실행될 때, JVM은 클래스 파일을 읽어들이고, 클래스의 구조 ( 예 : 필드, 메서드, 인터페이스 등 )와 같이 정보를 메소드 영역에 저장합니다.

메타스페이스 영역


메타스페이스는 자바 8부터 도입된 메모리 영역으로, 기존의 PermGen 영역을 대체 했습니다. 메타스페이스는 JVM이 사용하는 메모리 영역 중 하나로, 메서드 여역과 유사하게 클래스 메타데이터를 저장합니다. 하지만 중요한 차이점은 메타스페이스는 네이티브 메모리를 사용한다는 점입니다.

PC 레지스터


PC 레지스터 영역은 각 스레드마다 현재 수행 중인 JVM 명령의 주소가 저장되는 영역입니다.

자바는 하나의 프로세스이기 때문에 CPU에게 직접 연산을 수행하도록 하는 것이 아닌, JVM 리소스를 이용하여 현재 작업하는 내용을 CPU에게 연산으로 제공해야하며 이를 위한 버퍼 공간으로 PC 레지스터 영역을 활용합니다.

스택 영역


Stack 영역은 스레드 별로 생성되며 메소드 스코프에 할당된 로컬 변수 및 기본형 타입 변수, 객체에 대한 참초값을 저장하는 영역입니다.

JVM 스레드에는 스레드와 동시에 생성된 전용 Java 가상 머신 스택이 있습니다. JVM 스택은 스택 프레임이라고도 하는 프레임을 저장합니다.

스택의 구조는 C와 유사합니다.

stack 구조

여기서 Data 부분이 스택 프레임 부분으로 바뀐것 이라고 생각하면 편합니다

 

네이티브 메서드 스택


Native Method Stack은 스레드 별로 생성되며 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역입니다.

Java Native Interface ( JNI )에서 Native Method를 호출 시 JVM을 벗어나 네이티브 코드로 진입하게 되는데 이 때 스택 프레임이 Native Method Stack에 추가됩니다.

'백엔드' 카테고리의 다른 글

서버리스  (0) 2024.12.10
JPA vs Mybatis  (0) 2024.11.25
JAVA와 JVM  (0) 2024.08.12
의존성 주입!  (0) 2024.08.02
기능있는 주석 어노테이션이란 ?!?!!  (0) 2024.07.30