[Java] - JVM Series3 런타임 데이터 영역(심화 ver) #118
Unanswered
Irisation23
asked this question in
Java
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
📝 구성
Table of contents generated with markdown-toc
0. TL;DR 🔨
1. 메서드 영역 (Method Area)
모든 쓰레드가 공유하는 영역이라 다음과 같이 초기화 코드 정보들이 저장되게 된다.
1.1 Runtime Constant Pool
2. 힙 영역 (Heap Area)
모든 스레드에서 공유된다. JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해
런타임 시 동적으로 할당
하여 사용하는 영역이다.new 연산자로 생성되는 클래스와 인스턴스 변수, 배열 타입 등 Reference Type이 저장된다.
Method Area
영역에 저장된 클래스만이 생성이 될 수 있고 적재 될 수 있다.힙의 객체는 스택의 참조 타입 변수와 연결되어 있다.
해당 영역은 GC가 관리한다.
3. 스택 영역 (Stack Area)
스택 영역은 int, long, boolean 등 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 정보들이 저장되는 영역이다.
스택 영역은 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.
쓰레드를 종료하면 런타임 스택도 사라진다.
프로세스가 메모리에 로드 될 때 스택 사이즈가 고정되어 있어, 런타임 시에 스택 사이즈를 바꿀 수는 없다.
메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성되고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다.
그리고 메서드 수행이 끝나면 프레임별로 삭제된다.
4. PC 레지스터 (Program Counter Register)
PC 레지스터 쓰레드가 시작될 때 생성된다. 현재 수행중인
JVM 명령어 주소
를 저장하는 공간이다.JVM 명령의 주소는 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 가지고 있다.
JVM은 스택에서 비연산값 Operand를 뽑아 별도의 메모리 공간인 PC Register에 저장하는 방식을 취한다.
만약에 스레드가 자바 메소드를 수행하고 있으면 JVM 명령(Instruction)의 주소를 PC Register에 저장한다.
5. 네이티브 메서드 스택 (Native Method Stack)
네이티브 메서드 스택은 자바 코드가 컴파일되어 생성되는 바이트 코드가 아닌
실제 실행할 수 있는 기계어
로 작성된 프로그램을 실행시키는 영역이다.또한 자바 이외의 언어(C, C++, 어셈블리 등)로 작성된 네이티브 코드를 실행하기 위한 공간이기도 하다.
JIT 컴파일러에 의해 변환된 Native Code 역시 여기에서 실행이 된다고 보면 된다.
일반적으로 메소드를 실행하는 경우 JVM 스택에 쌓이다가 해당 메소드 내부에 네이티브 방식을 사용하는 메소드가 있다면 해당 메소드는 네이티브 스택에 쌓인다.
6. JNI (Java Native Interface)
JNI는 자바가 다른 언어로 만들어진 어플리케이션과 상호 작용할 수 있는 인터페이스 제공하는 프로그램이다.
JNI는 JVM이 Native Method를 적재하고 수행할수 있도로 한다.
하지만 실질적으로 제대로 동작하는 언어는 C / C++ 정도 밖에 없다고 한다.
7. Native Method Library
C, C++로 작성된 라이브러리를 칭한다.
만일 헤더가 필요하면 JNI는 이 라이브러리를 로딩해 실행한다.
4. 회고 🧹
2023-03-22 수
Beta Was this translation helpful? Give feedback.
All reactions