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 프로그램 실행 과정
1. 자바 프로그램이 실행되면 JVM이 OS로부터 실행에 필요한 메모리(Runtime Data Area)
를 할당받는다.
2. 자바 컴파일러가 자바 소스코드(.java)를 읽어 JVM이 이해할 수 있는 바이트코드(.class)로 컴파일한다.
3. JVM의 Class Loader
가 바이트코드를 JVM의 Runtime Data Area
로 로드한다.
4. JVM의 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