OS와 자바 기반 애플리케이션 사이의 매개체 역할을 하는 일종의 가상 서버로, 애플리케이션은 JVM 위에서 동작하도록 설계되어 있다.
이는 OS 환경과 무관하게 애플리케이션이 항상 동일하게 동작하는 것을 보장할 수 있다.
자바 애플리케이션을 실행하기 위해서는 반드시 JVM을 구동해야 하는데 JVM은 컴퓨터의 메모리와 CPU 사용량을 차지한다.
C 혹은 C++과 다르게 시스템 함수를 바로 사용할 수 없고 JNI(Java Native Interface)를 통해 JVM을 한번 더 거쳐야 시스템 자원에 접근할 수 있다.
*JNI : 자바 프로그램에서 해당 플랫폼에서만 실행 가능한 네이티브 코드에 접근하기 위해 만들어진 API
크게 Class Loader Subsytem, Runtime Data Area, Execution engine으로 나뉘며 Runtime Data Area에는 메소드, 스택, 힙, PC 레지스터, 네이티브 메소드 영역이 존재한다.
사진 출처: https://coding-start.tistory.com/205
자바 파일(.java)을 컴파일하면 바이트 코드인 클래스 파일(.class)이 된다.
그리고 해당 클래스 파일을 실행하면 JVM은 클래스 로더로 해당 파일을 읽어들인다.
클래스 로더는 클래스 파일의 정보를 메모리에 올리고 검증, 초기화 등의 작업을 처리한다.
Runtime Data Area는 JVM이라는 가상머신이 사용하는 메모리 공간이다.
실행 데이터 영역의 각 영역은 다음과 같은 역할을 한다.
위에서 메소드와 힙 영역은 모든 스레드가 공유하는 공간이고, 스택과 레지스터, 네이티브 메소드 영역은 각 스레드마다 개별로 생성하는 공간이다. 따라서 메소드와 힙 영역은 멀티 스레드에서 동기화에 주의해야 하는 영역이다.