케네스로그

[Java] JVM 아키텍처(3) - 실행 엔진 Execution Engine 본문

Dev/Java

[Java] JVM 아키텍처(3) - 실행 엔진 Execution Engine

kenasdev 2021. 10. 13. 12:16
반응형

이전 글에서는 클래스로더와 런타임 데이터 영역에 대해 알아보았다. 이번에는 JVM의 코드를 실행시키는 실행엔진에 대해 알아보자.

 

JVM 실행 엔진(Execution Engine)

Execution Engine은 실제로 클래스파일의 바이트코드를 머신코드로 변환하여 실행하는 부분이라고 할 수 있다. 그 외에도 최적화를 위한 Garbage Collector, JIT Compiler, 그리고 Java Native Method Interface로 구성된다.

 

1. 인터프리터 Interpreter

Java클래스파일의 바이트코드를 한줄씩 읽어서 native code(기계어)로 변환하여 실행하도록 한다. 다른 인터프리터 언어에서 사용되는 그 인터프리터가 맞다. 인터프리팅 방식의 문제는 반복 호출되는 메소드를 매번 인터프리팅해야해서 비효율적이다.

 

 

 

2. JIT Compiler

인터프리터의 문제를 해결하기 위해 JIT 컴파일러를 도입했다. 코드 전체에서 반복되어 호출되는 메소드는 JIT컴파일러에 의해 기계어로 변환되어 Native Method Stack에 저장된다. 변환된 부분은 인터프리터에 의해 실행되지않고 native code상태로 즉시 실행된다. 결과적으로 인터프리터의 단점을 극복하기 위해 고안된 방법이다. JIT Compiler는 이를 위해 여러 컴포넌트를 내장한다. (출처)

  • Intermediate Code Generator: intermediate representation(IR)이라는 중간코드를 통해 소스코드를 표현한다.
  • Code Optimizer: ICG에 의해 생성된 코드를 최적화한다.
  • Target Code Generator: 중간코드(IG)를 기계어로 전환한다.
  • Profiler: hot spot(반복 호출되는 메소드)를 찾는 역할을 한다.
⚠️ Java는 느리다?
Java는 머신에서 직접 돌아가는 언어가 아니라 JVM이라는 소프트웨어를 거쳐 실행하기 때문에 느리다는 말이 있다. JIT 컴파일러 등 최적화가 이루어지기 전엔 맞는 말이라고 할 수 있지만, 지금은 여러 개선을 통해 속도 향상이 많이 되었다. 인터프리터와 컴파일 방식 두가지를 혼용하여 기존의 단점을 극복했다.

 

 

3. 가비지 컬렉션(Garbage Collections)

Garbage Colletion은 자동으로 메모리를 관리해주는 기능 중 하나로, 메모리 공간에 할당된 객체 중 거의 사용되지 않거나 오래된 객체의 메모리를 반환함으로써 메모리 사용의 효율을 증가시킨다. C/C++에서는 동적으로 메모리를 할당하여 사용한 후 메모리 공간을 반환하지 않으면 프로그램이 실행하는 동안 계속해서 해당 메모리공간들을 차지하여 메모리 공간을 낭비하게 된다. Java에서는 이러한 Garbage Collection으로 인해 메모리 공간 관리에 편의성을 도모했다.

 

이론적으로 GC의 기능은 메모리 최적화를 목표로 하는 메커니즘을 가지지만, 모든 객체를 추적하고 복잡한 알고리즘을 가짐으로써 역기능을 초래하기도 한다. 관련 내용은 이곳에서 더 확인할 수 있다.

 

반응형