<aside>
<aside>
코드가 실제로 "돌아가는" 그 순간, JVM 내부에서 벌어지는 일
자바 코드를 실행한다고 했을 때, 우리 눈에는 main()
메서드가 호출되고 뭔가 콘솔에 출력되는 게 다지만, 그 안에서는 생각보다 똑똑하고 복잡한 과정이 일어나고 있다.
자바 코드는 .java
파일로 작성된 후 .class
로 컴파일되어 바이트코드 형태로 변환된다
그리고 이 바이트코드를 실행하는 주체가 바로 JVM의 실행 엔진(Execution Engine) 이다
실행 엔진은 바이트코드를 "실제 기계가 이해할 수 있는 형태(기계어)" 로 변환하고 실행하는 역할을 한다
그런데 이 바이트코드를 실행하는 방식에는 크게 두 가지가 있다
</aside>
JVM은 바이트코드를 받아 실행하는 역할을 하는데, 이 실행에는 크게 두 가지 방식이 있다.
인터프리터(Interpreter)
바이트코드를 한 줄 한 줄 해석해서 바로 실행하는 방식
실행은 빠르지만 매번 해석해야 하므로 반복되는 코드에서 비효율적
JIT 컴파일러(Just-In-Time Compiler)
JIT 컴파일러는 JVM이 "자주 실행되는 코드(Hot Code)"를 감지하면,
그 부분만 골라서 기계어로 변환(컴파일) 해두고, 이후에는 해석 없이 기계어를 직접 실행하는 방식이다
즉, "인터프리터 + 컴파일러의 하이브리드" 라고 보면 된다
"Just-In-Time" = 실행 중에, 즉석에서 컴파일한다는 뜻
[ 작동 원리 ]
JVM은 처음에는 인터프리터 방식으로 코드를 실행한다
실행 중, 어떤 메서드가 너무 자주 호출되면?
→ HotSpot이 해당 메서드를 "Hot Method"로 판단함
JIT 컴파일러가 해당 메서드를 기계어로 컴파일
이후부터는 바이트코드 해석 없이 기계어만 실행하여 속도 향상