<aside> 💡 위키(Wikipedia)에서는 JVM을 자바 다는 뜻이다. 컴파일된 바이너리 코드는 어떤 JVM에서도 실행할 수 있게 된다.
</aside>
[바이트코드(Bytecode)](<https://henu.notion.site/2-594202d059cd48ce9cf1e476d5e6d9b0>)
이기 때문에 이것을 해석하고 실행할 수 있는 가상의 운영체제가 필요하다. 이것이 자바 가상 머신(JVM: Java Virtual Machihe)이다.[가비지 컬렉션(GC: Garbage Collection)](<https://henu.notion.site/8-0a9c3048fa2c428e9ab7902e13b015b2>)
을 수행한다.
<aside> 💡 자바를 이용하여 개발하는 개발자라면 누구나 자바 바이트코드가 JRE(Java Runtime Environment, 자바 실행 환경) 위에서 동작한다는 사실을 잘 알고 있다. 이 JRE에서 가장 중요한 요소는 자바 바이트코드를 해석하고 실행하는 JVM이다. JRE는 자바 API와 JVM으로 구성되며, JVM의 역할은 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽어 들여서 자바 API와 함께 실행하는 것이다.
</aside>
[부록 그림 3 - 1] 자바 소스 파일 실행 과정
클래스 로더(Class Loader)
실행 엔진(Execution Engine)
[ ] 클래스를 실행시키는 역할을 한다.
<aside>
💡 이와 같은 바이트코드는 JVM 내부에서 기계가 실행할 수 있는 형태로 변환되며, 이는 [인터프리터(Interpreter)](<https://henu.notion.site/5-f94d38bfec314b9dac488deeb015f0f4>)
, [JIT(Just-In-Time)](<https://henu.notion.site/7-JIT-3a3f2f153b924ce6abc49396b0f12f32>)
방식으로 진행된다.
</aside>
런타임 데이터 영역(Runtime Data Area)
[ ] JVM이 프로그램을 수행하기 위해 운영체제(OS) 위에서 실행되면서 할당받는 메모리 영역이다. 런타임 데이터 영역은 크게 6개의 영역으로 나눌 수 있다. 이중 PC 레지스터(PC Register), JVM 스택(JVM Stack), 네이티브 메소드 스택(Native Method Stack)은 쓰레드(Thread)
마다 하나씩 생성되며 힙(Heap), 메소드 영역(Method Area), 런타임 상수 풀(Runtime Constant Pool)은 모든 쓰레드가 공유해서 사용한다.
[ ] 각 영역의 특징
[부록 그림 3 - 2] 런타임 데이터 영역의 구조
쓰레드가 시작될 때 생성되며, 각 쓰레드 별로 생성이 되기 때문에 다른 쓰레드는 접근할 수 없다.
스택 프레임(Stack Frame)이라는 구조체를 저장하는 스택으로 JVM은 오직 JVM 스택에 스택 프레임을 추가(Push)하고 제거(Pop)하는 동작만 수행한다.
[부록 그림 3 - 3] JVM 스택 구성
<aside> 💡 스택 프레임(Stack Frame)은 JVM 내에서 메소드(Method)가 수행될 때마다 하나의 스택 프레임이 생성되어 해당 스레드의 JVM 스택에 추가되고 메서드가 종료되면 스택 프레임이 제거된다. 각 스택 프레임은 지역 변수 배열(Local Variable Array), 피연산자 스택(Operand Stack), 현재 실행 중인 메서드가 속한 클래스의 런타임 상수 풀에 대한 레퍼런스를 갖는다. 지역 변수 배열, 피연산자 스택의 크기는 컴파일 시에 결정되기 때문에 스택 프레임의 크기도 메서드에 따라 크기가 고정된다.
</aside>
예외 발생 시 printStackTrace() 등의 메소드로 보여주는 Stack Trace의 각 라인은 하나의 스택 프레임을 표현한다.
JNI(Java Native Interface)
를 통해 호출하는 C / C++ 등의 코드를 수행하기 위한 스택으로, 언어에 맞게 C 스택이나 C++ 스택이 생성된다.모든 스레드가 공유하는 영역으로 JVM이 시작될 때 생성된다.
JVM이 읽어 들인 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메소드 정보, Static 변수, 메소드의 바이트코드 등을 보관한다.
<aside> 💡 메소드 영역에 올라가는 정보의 종류
</aside>
메소드 영역은 JVM 벤더마다 다양한 형태로 구현할 수 있으며, 오라클 핫스팟 JVM(HotSpot JVM)에서는 흔히 Permanent Area, 혹은 Permanent Generation(PermGen)이라고 불린다. 메서드 영역에 대한 가비지 컬렉션은 JVM 벤더의 선택 사항이다.
프로그램 상에서 런타임 시 동적으로 할당하여 사용하는 영역이다.
new 키워드
를 사용하여 생성된 객체와 배열, 인스턴스 등을 저장하는 가상 메모리 공간이다.
가비지 컬렉션(Garbage Collection)의 대상이 된다.
JVM 성능 등의 이슈에서 가장 많이 언급되는 공간이다.
<aside> 💡 힙 구성 방식이나 가비지 컬렉션 방법 등은 JVM 벤더의 재량이다.
</aside>
힙은 세 부분으로 나눌 수 있다.
[부록 그림 3 - 4] 힙 구성
Metaspace 영역
으로 변경되었다.