JVM(자바 가상 머신, Java Virtual Machine)이란 자바 프로그램을 실행하기 위한 가상 머신으로, 자바 바이트코드(.class)를 OS에 맞게 기계어로 해석하여 자바 프로그램이 OS에 독립적으로 수행될 수 있도록 돕는 역할을 한다.
※ 이미지 출처 : https://www.geeksforgeeks.org/how-many-types-of-memory-areas-are-allocated-by-jvm/
자바 컴파일러에 의해 컴파일된 바이트코드들을 엮어 Runtime Data Area로 로드하는 역할을 수행하는 모듈이다. 런타임에 동적으로 바이크코드들을 로드하고 링크한다.
Class Loader가 로드해 준 바이트코드들을 OS가 이해할 수 있는 기계어로 해석하여 수행하는 모듈이다. 이 때, 자주 사용되는 코드를 내부적으로 캐싱해두고 재사용하는 JIT 컴파일러 방식을 활용한다.
메모리 관리를 위해 Garbage Collector를 수행하기도 한다.
Garbage Collector
Runtime Data Area의 Heap 메모리 영역의 객체들 중 더 이상 참조되지 않는 객체들을 찾아 제거하는 역할을 수행
자바 프로그램 실행을 위해 OS로부터 할당받은 메모리 영역이다. 실행에 필요한 각종 데이터들이 적재된다.
Java 프로그램 실행 과정
(Runtime Data Area)
를 할당받는다.Class Loader
가 바이트코드를 JVM의 Runtime Data Area
로 로드한다.Execution Engine
이 OS에 맞게 바이트코드를 기계어로 해석하여 실행한다.컴파일
작성한 자바 소스파일(Hello.java)을 javac
명령어를 사용해 컴파일.
$ javac Hello.java
실행
컴파일된 바이트코드(Hello.class)를 java
명령어를 사용해 실행.
$ java Hello
자바로 작성한 소스 코드(.java)를 JVM이 이해할 수 있는 형태(.class)로 컴파일한 코드를 말한다. JVM은 바이트코드를 다시 하드웨어 아키텍처 및 OS가 이해할 수 있는 기계어로 해석(인터프리팅)한다. 이 과정을 통해 자바 프로그램은 OS에 종속적이지 않고 어떤 환경에서도 실행될 수 있게 된다.
JIT(Just-In-Time) 컴파일러는 프로그램을 실행하기 전에 전체를 컴파일 하는 방식이 아닌, 프로그램이 실제 실행되는 시점에 기계어로 번역하여 실행하는 방식을 사용하는 컴파일러이다.
JIT 컴파일러는 이 과정에서 자주 사용되는 코드를 JVM 안에 기계어로 캐싱해두고 반복 호출될 때마다 이를 재사용하며, 변경된 부분에 대해서만 다시 인터프리팅을 실행하는 기법을 사용하여 성능을 높였다.
※ 이미지 출처 : https://www.intexsoft.com/blog/post/jvm.html
JDK는 자바 실행 환경(JRE)과 자바 프로그램 개발을 위해 필요한 모든 툴들을 모아놓은 소프트웨어 패키지이다. 대표적인 개발 툴들은 다음과 같다.
이 외 수많은 개발 툴들이 JDK 안에 포함되어 있다.
※ 참고자료 : https://ko.wikipedia.org/wiki/자바_개발_키트
자바 프로그램을 실행하기 위한 최소한의 환경으로, 바이트코드를 JVM으로 로드하는 역할을 수행한다. 위에서 설명한 JVM과 프로그램 실행에 필요한 라이브러리와 각종 기타 파일들이 포함되어 있다.
_※ 참고자료 : https://www.itworld.co.kr/t/62076/%EA%B0%80%EC%83%81%ED%99%94/110768
_