<aside>

JVM 시리즈

  1. 왜 JVM을 알아야 할까 (+ JVM 구조 한눈에 보기)
  2. JVM의 메모리 - Runtime Data Area
  3. Class Loader와 부모 위임 원칙
  4. 실행 엔진: 인터프리터와 JIT 컴파일러
  5. Garbage Collection
  6. GC 튜닝
  7. 가짜 JVM 만들어보기 </aside>

<aside>

코드가 실제로 "돌아가는" 그 순간, JVM 내부에서 벌어지는 일

자바 코드를 실행한다고 했을 때, 우리 눈에는 main() 메서드가 호출되고 뭔가 콘솔에 출력되는 게 다지만, 그 안에서는 생각보다 똑똑하고 복잡한 과정이 일어나고 있다.

자바 코드는 .java 파일로 작성된 후 .class로 컴파일되어 바이트코드 형태로 변환된다

그리고 이 바이트코드를 실행하는 주체가 바로 JVM의 실행 엔진(Execution Engine) 이다

실행 엔진은 바이트코드를 "실제 기계가 이해할 수 있는 형태(기계어)" 로 변환하고 실행하는 역할을 한다

그런데 이 바이트코드를 실행하는 방식에는 크게 두 가지가 있다

</aside>

JVM의 두 가지 실행방식

JVM은 바이트코드를 받아 실행하는 역할을 하는데, 이 실행에는 크게 두 가지 방식이 있다.

인터프리터(Interpreter)

바이트코드를 한 줄 한 줄 해석해서 바로 실행하는 방식

실행은 빠르지만 매번 해석해야 하므로 반복되는 코드에서 비효율적

JIT 컴파일러(Just-In-Time Compiler)

JIT 컴파일러는 JVM이 "자주 실행되는 코드(Hot Code)"를 감지하면,

그 부분만 골라서 기계어로 변환(컴파일) 해두고, 이후에는 해석 없이 기계어를 직접 실행하는 방식이다

즉, "인터프리터 + 컴파일러의 하이브리드" 라고 보면 된다

"Just-In-Time" = 실행 중에, 즉석에서 컴파일한다는 뜻

[ 작동 원리 ]

  1. JVM은 처음에는 인터프리터 방식으로 코드를 실행한다

  2. 실행 중, 어떤 메서드가 너무 자주 호출되면?

    HotSpot이 해당 메서드를 "Hot Method"로 판단함

  3. JIT 컴파일러가 해당 메서드를 기계어로 컴파일

  4. 이후부터는 바이트코드 해석 없이 기계어만 실행하여 속도 향상