💡 바이트 코드 해석 및 실행(Byte Code Interpretation and Runtime) - 해당 과정은 JVM의 클래스 파일의 ‘바이트 코드를 해석’하여 명령어를 수행하는 역할을 수행합니다. - 해당 역할을 Execution Engine의 Interpreter와 JIT가 수행을 하며 네이티브 코드에 대한 해석은 Native Method Interface, Native Method Libaray에서 수행을 합니다. - 이때 JVM은 스택 기반의 가상머신으로 동작하여 스택 프레임을 사용하여 메서드 호출과 반환을 관리합니다. - JVM 내에서 Runtime Data Area와 Execution Engine(JIT, Interpreter)에서 수행을 합니다.
4.1. 인터프리터(Interpreter)의 바이트 코드 수행 및 실행 과정
💡 인터프리터(Interpreter) - Java 프로그램을 실행하기 위해 바이트 코드를 한 줄씩 해석하는 도구입니다. 이를 통해 Java 소스 코드를 컴파일하여 생성된 바이트 코드를 실행할 수 있습니다.
💡 인터프리터 (Interpreter) 수행과정
1. 이전에 생성하고 할당된 메모리를 기반으로 바이트 코드를 읽어옵니다.
2. 인터프리터를 통해 바이트 코드를 한 줄씩 읽고 해석합니다.
3. 바이트 코드를 해석하는 동안 인터프리터는 필요한 메모리 및 리소스를 할당하고 해당 바이트 코드에 따라 실행합니다.
4. 바이트 코드가 실행되는 동안 인터프리터는 필요한 경우에 따라 라이브러리 및 다른 클래스를 로드하고 사용합니다.
5. 인터프리터는 바이트 코드를 순차적으로 해석하면서 프로그램을 실행합니다.
4.2. JIT(Just-In-Time)의 바이트 코드 수행 및 실행 과정
💡 JIT(Just-In-Time)
- Java 프로그램을 실행하고 실행 패턴을 분석하고 최적화하는 동적 컴파일 기술입니다.
- 해당 기술은 프로그램을 실행하는 동안 실시간으로 바이트 코드를 기계어로 변환하여 성능을 향상합니다. - 코드를 인터프리터 방식으로 실행하는 것보다 더 빠른 실행 속도를 제공할 수 있습니다.
💡 JIT(Just-In-Time) 수행과정
1. 이전에 생성하고 할당된 메모리를 기반으로 바이트 코드를 읽어옵니다.
2. JIT 컴파일러는 실행 중인 프로그램을 모니터링하면서 빈번하게 실행되는 코드 블록을 식별합니다.
3. 해당 코드 블록은 인터프리터에 의해 실행될 때마다 JIT 컴파일러에 의해 기계어로 변환됩니다.
4. JIT 컴파일러는 변환된 기계어 코드를 캐시에 저장합니다.
5. 이후 동일한 코드 블록이 다시 호출되면, 캐시에 저장된 기계어 코드를 실행하여 인터프리터에 비해 훨씬 빠른 실행 속도를 제공합니다.
[더 알아보기 ] 💡 컴파일러(Compiler)
- 소스 코드를 기계어 또는 바이트 코드로 변환하는 프로그램으로 일반적으로 고급언어로 작성된 소스코드를 기계어로 변환하여 실행할 수 있는 형태로 만들어주는 역할을 수행합니다.
4.3. Native Method Interface의 바이트 코드 수행 과정
💡 Native Method Interface (JNI) - Java 프로그램이 C 또는 C++과 같은 네이티브 코드를 호출하고 상호 작용할 수 있게 해주는 기능을 제공합니다.
- 해당 부분은 JVM이 바이트 코드를 해석하고 실행하는 동안 네이티브 메서드를 호출하고 해당 코드가 네이티브 코드로 실행될 수 있도록 합니다.
4.4. Native Method Libaray의 바이트 코드 수행
💡 Native Method Library - C 또는 C++과 같은 특정 프로그래밍 언어로 구현된 네이티브 메서드의 컬렉션입니다. 추가 기능이나 시스템 수준의 리소스에 액세스 할 수 있는 기능을 제공합니다.