///////
Search
📌

JVM은 어떤 방식으로 코드를 해석하고 실행시키는지 흐름에 맞게 설명해 주세요. (Java 실행 흐름)

→ 요약하면, JVM은 먼저 바이트코드를 메모리에 로드하고, 이를 확인하고, 필요한 메모리 공간을 준비하고, 클래스 및 정적 필드를 초기화하고, 스택 기반 실행 모델을 사용하여 바이트코드를 실행하고, 주기적으로 가비지 수집을 수행하여 바이트코드를 해석하고 실행합니다. 메모리 공간을 확보한다.
(feat. Chat GPT)
1. JVM은 OS로부터 메모리를 할당한다.
2. 자바 컴파일러가 자바 소스코드를 자바 바이트코드로 컴파일한다
-- 이 바이트코드 파일을 실행 하는 순간 JVM이 동작된다. --—
3. Class Loader를 통해 JVM Runtime Data Area의 Method Area로 로딩한다.
자바는 동적으로 클래스를 읽어오는데, 이때 동적으로 클래스를 로딩해주는 역할을 클래스 로더가 한다.
.class(바이트)파일을 묶어서 운영체제로부터 할당 받은 메모리(JVM Runtime Data Area)의 Method Area에 적재한다.
4. Runtime Data Area에 로딩 된 .class들은 Execution Engine을 통해 해석한다.
이 과정에서 자바 바이트 코드를 JVM이 컴퓨터가 실행할 수 있는 형태로 변경함. 바이트 코드는 JVM이 이해할 수 있는 언어이고 이를 컴퓨터에서 실행시키기 위해서는 Native code로 변환해야 하기 때문.
Execution Engine에는 JIT 컴파일러와 인터프리터가 있다.
인터프리터 - 바이트 코드를 한줄한줄 읽으면서 OS가 실행할 수 있도록 기계어로 번역, 실행속도가 느린 단점
JIT 컴파일러 - 자주 반복되는 코드를 기계어로 변환해서 캐싱 함, 실행속도가 빨라지지만 nativecode로 변환하는데 비용이 발생
이런 변환 비용 때문에 jvm은 모든 코드를 JIT Compiler방식으로 실행하지 않고 인터프리터 방식을 사용하다 자주 사용되는 코드만 캐싱 함.
JIT 컴파일러와 인터프리터는 동시에 런타임 영역에서 다른스레드에서 실행됨
5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC의 작동과 스레드 동기화가 이루어진다.
JVM 메모리구조 + 동작방식
참고