자바의 실행과정(JVM,JIT)
by 키위먹고싶다컴퓨터는 사람이 이해하는 고급언어로 작성된 소스코드를 알아듣지 못한다. 그래서 프로그램을 실행시키려면 기계가 이해 할 수 있는 기계어로 번역하는 과정이 필요하다. 이때 사용하는 것이 컴파일러와 인터프리터이다.
컴파일러(compiler)
컴파일은 런타임전에 빌드타임시 모든 소스코드에 대한 기계어를 생성한다.
그래서 빌드가 느리고 생성된 기계어는 정적이다. 런타임 시 특별한 과정이 없어서 속도가 빠르다.
컴파일 방식은 운영체제에 맞는 컴파일러가 필요하므로 운영체제에 종속적이다.
인터프리터(Interpreter)
인터프리터는 컴파일과 다르게 빌드타임이 아니라 런타임 시 row단위로 분석한다. 실행속도가 느리지만 코드 변경시 즉시 실행이 가능하다. 소스코드 한줄을 읽고 그 기능에 대응하는 중간코드로 변환하여 실행파일이 따로 생성되지 않는다.
자바 프로그래밍의 실행 과정
자바 컴파일러
자바 컴파일러는 자바를 가지고 작성한 자바소스코드를 JVM이 이해할 수 있는 자바 바이트 코드로 변환시킨다.
자바 바이트코드
자바 바이트코드는 JVM이 이해할 수 있는 언어로 변환된 자바 소스코드이다.
자바 바이트코드의 확장자는 .class이다.
자바 바이트코드는 JVM이 설치되어 있으면, 어떤 운영체제에서라도 실행될 수 있다.
자바 가상머신(JVM)
자바 가상 머신(JVM, Java Virtual Machine)은 자바 바이트코드를 실행시키기 위한 가상의 기계이다. 자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있으므로 자바 프로그램을 실행시키려면 반드시 JVM이 설치되어야 한다.
윈도우 운영체제에는 윈도우용 JVM이 있고, 리눅스 운영체제에는 리눅스용 JVM이 존재한다. JVM은 운영체제에 종속적이므로 각 운영체제에 맞는 자바 가상 머신을 설치해야한다. 그니까 서로 다른 운영체제라도 JVM만 설치되어있으면 같은 프로그램이 추가 조치 없이 동작할 수 있다. 그래서 개발자가 한번 프로그램을 작성하면, 모든 운영체제에서 같이 사용할 수 있다는 장점이 있다. 또한 일반 프로그램을 실행하는것과 달리 자바 프로그램을 실행할 때 JVM단계를 거쳐야 하므로 속도가 느리다는 단점이 있다.
JVM은 클래스로더, 자바인터프리터, JIT컴파일러, 가비지 컬렉터로 구성된다.
클래스로더
클래스로더는 프로그램이 실행중인 런타임때 모든 코드가 자바 가상머신과 연결되는데 이렇게 동적으로 클래스를 로딩및 링크 하는 역할을 한다.
*링크 : 소스코드 양이 많을 때 한 파일에 소스코드를 작성할 수 없어서 파일을 분리시키는데 분리된 소스파일을 하나로 합치는 것.
자바 인터프리터
자바 인터프리터는 자바 컴파일러에 의해 변환된 자바 바이트코드를 읽고 해석한다.
JIT 컴파일러
Just-In-Time compiler란 프로그램이 실행 중인 런타임에 실제 기계어로 변환해주는 컴파일러이다.
자바 컴파일러가 생성한 자바 바이트 코드를 런타임시에 기계어로 번역한다. 동적 번역이라고도 하며 프로그램의 실행 속도를 향상시키기 위해 사용한다. 이러한 번역은 코드가 실행되는 과정에서 실시간으로 일어난다.
Jit 컴파일러는 한번 기계어로 번역된 코드를 다시 컴파일 하지 않고 캐싱했다가 재실행 할 때 사용한다.
초기에 인터프리트 방식으로 바이트 코드를 변환하면서 그 코드(기계어로 변환됨)를 저장소에 저장해놓고 다시 호출될때 이 저장소에 있는 코드를 사용한다.
'java' 카테고리의 다른 글
가비지컬렉터(Garbage Collector) (0) | 2022.02.05 |
---|---|
JVM 클래스로더 (0) | 2022.01.22 |
stream에 대한 정리 (0) | 2021.12.22 |
익명객체와 함수형인터페이스 '람다식' (0) | 2021.12.16 |
ThreadPoolExecutor을 이용한 효율적인 멀티쓰레드 이용 (0) | 2021.12.15 |
블로그의 정보
kiwi
키위먹고싶다