이전에 JVM의 구조와 특징에 대한 글을 게시한 적이 있다. (https://skroy0513.tistory.com/22)
그중 실행 엔진에 대해서 좀 더 자세히 알아보고자 공부해 보았다.
실행 엔진 (Execution Engine) 이란
JVM은 Java 컴파일러가 컴파일한 바이트 코드를 Class Loader를 이용해 메모리(Runtime Data Area)에 실행 가능한 상태로 적재한다.
실행엔진은 메모리에 할당된 바이트 코드를 실행하는 역할을 담당한다.
기존의 .java 파일인 소스코드는 기계가 읽을 수 없는 언어이기 때문에 컴파일러가 .class인 바이트 코드로 변환을 해 준 뒤, 실행 엔진은 해당 바이트 코드를 한 줄씩 읽어 실행하는 인터프리터, JIT 컴파일러, 가비지 컬렉터 등의 동작으로 바이트 코드를 실행한다.
실행 엔진에서는 변환된 바이트 코드를 한 줄마다 읽으며 변환하는 작업을 거친다.
실행 엔진의 구성 요소
인터프리터 (Interpreter)
바이트 코드를 기계가 이해할 수 있도록 기계어로 바꾸는 작업을 한다.
바이트 코드를 한 줄마다 컴파일을 하여 변환하는 작업을 하게 되는데 같은 메서드라도 여러 번 호출될 때 매번 새로 수행해야 하기 때문에 비효율적이며 Running Time도 길어지게 된다.
이러한 중복되는 바이트 코드들에 대해서는 JIT 컴파일러를 사용한다.
JIT 컴파일러 (Just In Time Compiler)
앞서 말했던 인터프리터의 단점을 해결하기 위해서 나온 방법인 만큼 속도가 느린 단점을 극복하고 시스템의 성능을 향상하기 위해서 도입된 방법이다.
개념을 간단하게 설명하자면 '자주 실행되는 바이트 코드 영역을 런타임 중에 기계어로 컴파일하여 사용한다.' 라고 볼 수 있다.
기본적으로 인터프리터가 한 줄 한 줄 읽어 들이면서 기계어로 번역하지만, JIT 컴파일러를 통해 같은 코드를 매번 해석하지 않고 인터프리트를 하면서 자주 쓰이는 코드를 캐싱하고, 이후에는 캐싱된 코드를 가져다 쓴다.
따라서 한 줄 한 줄 읽고 번역해야 하는 인터프리터의 느린 실행 속도를 개선할 수 있게 된다.
가비지 컬렉터 (Garbage Collector)
JVM의 힙 영역에 존재하는 Unreachable 객체들을 찾아서 지우는 역할을 한다.
Stack 영역의 객체들은 메서드가 끝나면은 하나씩 없어지지만, Heap 영역의 객체들은 GC를 통해서 지워진다.
가비지 컬렉터 : https://skroy0513.tistory.com/27
참고
'멋진 개발자 > Java & Spring' 카테고리의 다른 글
개발자 성장 기록 60 - Bean (0) | 2024.05.09 |
---|---|
개발자 성장 기록 55 - MyBatis의 동적쿼리 (0) | 2024.04.24 |
개발자 성장 기록 54 - JSP (0) | 2024.04.23 |
개발자 성장 기록 53 - Java의 동일성, 동등성 (0) | 2024.04.22 |
개발자 성장 기록 51 - MyBatis (0) | 2024.04.18 |