JVM (4) - Execution Engine

@MinSang · July 15, 2024 · 3 min read

Execution Engine

binary 파일로 컴파일된 클래스 파일들을 클래스 로더에 의해 JVM 메모리 영역에 할당되었다면 이제 실행을 해야합니다. 코드를 실행하기 위해서는 execution engine(실행엔진)이 사용됩니다.

실행엔진은 클래스파일을 실행하기 위해 총 3가지의 주요 구성요소인 Interpreter, JIT Compiler 그리고 Garbage Collector 가 있습니다.

Interpreter

인터프리터는 바이트코드를 읽고 기계어(native code)로 변환한후 순차적으로 실행합니다.

이 구성요소는 파일 이름 인자를 받아 명령 줄에서 이 애플리케이션을 작동시킵니다. 이로인해 생기는 문제점은 매번 같은 메서드를 다시 해석(변환)하고 실행하기 때문에 시스템 성능이 저하됩니다.

이 문제를 극복하기 위해 JIT 컴파일러가 1.1버전에 도입되었습니다.

JIT(Just In Time) Compiler

JIT 컴파일러는 런타임에 JVM 과 상호작용하여 바이트코드를 기계어로 컴파일합니다. 하드웨어는 JVM이 동일한 바이트코드를 만났을 때 이것을 다시 해석하는 대신 미리 컴파일된 기계어를 실행시킴으로서 실행속도의 성능 향상으로 이어집니다.

실행 시간에 JVM은 클래스 파일들을 로드하고, 바이트코드를 기계어로 컴파일 하는 동안, 간단한 최적화를 수행합니다. 해석 과정에서 추가적인 프로세서와 메모리 사용으로 인해 Java 애플리케이션은 네이티브 애플리케이션에 비해 느리게 실행됩니다. 또한 JVM이 처음 시작되면 수천 개의 메소드를 호출합니다. 이러한 모든 메소드를 컴파일하고 최적화하는 과정에서 시작 시간에 상당한 영향을 미칠 수 있습니다.

JIT 컴파일러에는 Profiler가 있습니다. 이 도구는 자바 바이트 구성 및 작업을 JVM 레벨에서 모니터링하는 역할을 담당합니다.

Garbage Collector

이 프로그램은 메모리를 자동적으로 관리합니다. 항상 백그라운드에서 실행되는 데몬 쓰레드 입니다. 기본적으로 더이상 참조되지 않는 객체를 찾아 삭제하여 힙 메모리를 확보하는 역할을 합니다.

@MinSang
지식과 경험을 기록하는 TIL 저장소