자바 소스 파일(.java)
을 JVM
으로 실행하는 과정 이해하기.
JVM
이란 무엇인가바이트코드
란 무엇인가컴파일
하는 방법JIT
컴파일러란 무엇이며 어떻게 동작하는가(.java)
실행하는 방법JVM
구성 요소JDK
와 JRE
의 차이위키백과에 나온 내용을 보니 JVM
은 어떤 방식을 통하여 자바 자바 바이트코드
를 실행하게 만들어주는 무엇인것 같다.
😲 자바 가상 머신(Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다.
📖 위키백과
일반적으로 JVM
은 인터프리터나 JIT
컴파일 방식으로 다른 컴퓨터 위에서 자바 바이트코드를 실행할 수 있도록 구현된다.
자바 바이트코드는 플랫폼에 독립적이며, 모든 JVM
은 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.
쉽게 말해 JVM
은 일련의 어떤 방식을 통해 자바 바이트코드
로 변환된 .java
를 실행하고 메모리를 관리해주는 역할을 하는 것이다.
다음은 JVM
의 동작방식 그림이다.
[JVM 동작 방식 이미지 출처] : https://asfirstalways.tistory.com/158
jvm
은 크게 3가지의 영역으로 나뉜다.
Class Loader는 컴파일된 .class
파일들을 엮어서 OS에게 할당받은 메모리 영역, Runtime Data Area에 적재한다.
Runtime Data Area에 적재된 .class
파일들을 컴퓨터가 이해할 수 있는 기계어(네이티브 코드)로 변경해 명령어 단위로 실행하는 역할을 한다.
이때 명령어를 하나씩 실행하는 interpreter 방식과 자바 바이트코드
를 네이티브 코드로 변환하는 JIT
방식이 있다.
🤓 Interpreter & JIT?
Interpreter : 자바 컴파일러에 의해 변환된자바 바이트코드
를 한 줄씩 읽고 해석하는 역할을 한다.
JIT (Just - In - Time) : 적절한 시점에 바이트코드 전체를 읽어 네이티브 코드로 캐싱해놓고 읽어오는 방식이다.
.class
파일들이 적재되어있는 장소인 Runtime Data Area는 다룰 내용이 많으므로 jvm
이 OS로부터 할당 받은 메모리 공간이라고만 알고 넘어가자.
jvm
은 아래와 같은 순서로 동작한다.
.java
파일(Java Source code)이 자바 컴파일러에(javac
) 의해 .class
(자바 바이트코드
)로 변환된다..class
파일들을 Runtime Data Area에 적재 시킨다.자바 바이트코드
란 쉽게 말해 JVM
이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다.
변환된 자바 바이트코드
의 확장자는 .class
이다.
🤔 그래서 왜 자바 바이트 코드라고 부르는건데??
자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1Byte라서
자바 바이트코드
라고 한다.
자바 바이트코드
는 자바 컴파일러에 의해 변환된다고 되어있는데, 컴파일은 어떻게 하는걸까?
컴파일은 jdk
혹은 jre
이 설치되어 있다면 javac
명령어로 직접 컴파일할 수 있다.
자바 바이트코드
로 컴파일 되는 과정
자바 소스 코드 파일(.java)
-> 자바 컴파일러(javac)
-> 자바 바이트코드(.class)
😲 JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.
📖 위키백과
interpreter의 단점을 보완하기 위해 도입되었으며, 한 번 컴파일된 코드는 계속 빠르게 수행된다.
JIT
는 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고, 일정 정도를 넘을때에만 컴파일을 수행한다.
[JDK와 JRE] : https://c10106.tistory.com/3135