3.1 JVM(Java Virtual Machine, 자바 가상 머신)이란?

<aside> 💡 위키(Wikipedia)에서는 JVM을 자바 다는 뜻이다. 컴파일된 바이너리 코드는 어떤 JVM에서도 실행할 수 있게 된다.

</aside>

  1. JVM은 자바와 운영체제 사이의 중계자 역할을 하여, 자바가 운영체제에 의존하지 않고 실행될 수 있게 한다.
  2. 대표적인 컴퓨터 아키텍처인 인텔 x86 아키텍처나 ARM 아키텍처와 같은 하드웨어가 레지스터 기반으로 동작하는데 비해 JVM은 스택 기반으로 동작한다.

자바 프로그램은 완전한 기계어가 아닌, 중간 단계의 [바이트코드(Bytecode)](<https://henu.notion.site/2-594202d059cd48ce9cf1e476d5e6d9b0>)이기 때문에 이것을 해석하고 실행할 수 있는 가상의 운영체제가 필요하다. 이것이 자바 가상 머신(JVM: Java Virtual Machihe)이다.

  1. 심볼릭 레퍼런스(Symbolic Reference)
  2. JVM은 메모리 관리, [가비지 컬렉션(GC: Garbage Collection)](<https://henu.notion.site/8-0a9c3048fa2c428e9ab7902e13b015b2>)을 수행한다.
  3. C와 C++ 등의 전통적인 언어는 플랫폼에 따라 int 형의 크기가 변한다. 하지만 JVM은 기본 자료형을 명확하게 정의하여 호환성을 유지하고 플랫폼 독립성을 보장한다.
  4. 네트워크 바이트 오더(Network Byte Order)

<aside> 💡 자바를 이용하여 개발하는 개발자라면 누구나 자바 바이트코드가 JRE(Java Runtime Environment, 자바 실행 환경) 위에서 동작한다는 사실을 잘 알고 있다. 이 JRE에서 가장 중요한 요소는 자바 바이트코드를 해석하고 실행하는 JVM이다. JRE는 자바 API와 JVM으로 구성되며, JVM의 역할은 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽어 들여서 자바 API와 함께 실행하는 것이다.

</aside>


3.2 JVM 구조

JVM은 크게 클래스 로더(Class Loader), 런타임 데이터 영역(Runtime Data Areas), 실행 엔진(Execution Engine)으로 구성되어 있다. 자바 소스 파일로 작성한 코드는 클래스 로더가 컴파일된 자바 바이트코드를 런 타임 데이터 영역에 로드하고, 실행 엔진이 자바 바이트코드를 실행한다.

[부록 그림 3 - 1] 자바 소스 파일 실행 과정

[부록 그림 3 - 1] 자바 소스 파일 실행 과정

구성요소

  1. 클래스 로더(Class Loader)

  2. 실행 엔진(Execution Engine)

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