JVM이란
운영체제는 자바 프로그램을 바로 실행할 수 없는데, 그 이유는 자바 프로그램은 완전한 기계어가 아닌, 중간 단계의 바이트 코드이기 때문이다. 이것을 해석하고 실행 할 수 있는 가상의 운영체제가 필요하다. 이것이 자바 가상 기계(JVM : Java Virtual Machine)이다. JVM은 실 운영체제를 대신해서 자바 프로그램을 실행하는 가상의 운영체제 역할을 한다.
자바 프로그램은 확장자가 .java인 파일을 작성하는 것부터 시작된다. 이것을 소스 파일이라고 하는데, 이 소스 파일을 컴파일러로(javac.exe)로 컴파일하면 확장자가 .class인 바이트 코드 파일이 생성된다. 바이트 코드 파일은 JVM 구동 명령어(java.exe)에 의해 JVM에서 해석되고 해당 운영체제에 맞게 기계어로 번역된다. 바이트 코드는 하나지만 JVM에 의해서 번역되는 기계어는 운영체제에 따라 달라진다.
바이트 코드는 모든 JVM에서 동일한 실행결과를 보장하지만, JVM은 운영체제 종속적이다. 자바 프로그램을 운영체제가 이해하는 기계어로 번역해서 실행해야 하므로 JVM은 운영체제에 맞게 설치되어야 한다. JVM은 JDK 또는 JRE를 설치하면 자동으로 설치되는데, JDK와 JRE가 운영체제 별로 제공된다.
JVM 구성
클래스 로더(Class Loader)
클래스 로더는 자바 클래스 파일들을 JVM내로 동적으로 로딩한다. 자바 언어는 클래스를 여러 개의 파일로 분할하여 저장할 수 있고, 이러한 클래스들이 필요할 때마다 클래스 로더가 필요한 클래스들을 찾아서 메모리로 로드한다.
실행 엔진(Execution Engine)
실행 엔진은 로드된 바이트 코드를 기계어로 해석하고 실행한다. JVM은 주로 두가지 방식의 실행 엔전을 사용한다.
- 인터프리터(Interpreter) : 바이터 코드를 한 줄씩 읽어들여 기계어로 번역하고 실행한다. 빠른 실행 속도를 보장하지는 않지만, 플랫폼 독립성을 유지할 수 있다.
- JIT 컴파일러(Just-In-Time Compiler) : 인터프리터의 느린 실행 속도를 보완하기 위해 바이트 코드를 바로 기계어로 번역하여 실행한다. 반복적으로 실행되는 코드는 네이티브 코드로 컴파일 되어 더 빠른 실행이 가능하도록 한다.
런타임 데이터 영역(Runtime Data Area)
런타임 데이터 영역은 JVM이 실행되면서 프로그램의 데이터를 저장하는 메모리 공간이다.
주요 구성 요소로는
- 메소드 영역(Method Area): 클래스 로더에 의해 로드된 클래스의 정보(클래스 이름, 변수, 메소드 등)를 저장한다.
- 힙(Heap): 동적으로 생성된 객체들이 저장되는 공간으로, 인스턴스 변수와 객체 자체가 저장된다.
- 스택(Stack): 각 스레드마다 별도의 스택이 생성되며, 메소드 호출과 관련된 정보(로컬 변수, 매개변수, 메소드 호출 등)가 저장된다.
- PC 레지스터(Program Counter Register): 현재 수행 중인 명령어의 주소를 가리킨다.
- 네이티브 메소드 스택(Native Method Stack): 자바 외부의 네이티브 코드(C, C++ 등)를 실행하는데 사용된다.
참고
https://code-lab1.tistory.com/92
https://coding-factory.tistory.com/827
https://www.yes24.com/Product/Goods/112208302
'Programming Language > Java' 카테고리의 다른 글
[Java] 변수(Variable) (0) | 2024.01.04 |
---|---|
[Java] synchronized는 자바 몇 버전 부터 사용된 걸까? (0) | 2023.09.10 |
[Java] Garbage Collection(가비지 컬렉션)이란 (0) | 2023.04.19 |
[Java] 자바의 문자열(String) 함수 정리 (0) | 2023.03.23 |
[Java] 자바(Java)의 특징 정리 (0) | 2022.10.27 |