자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.
JVM은 Java Vertual Machine의 줄임말이며, Java 바이트코드(*.class 파일)를 운영체제나 CPU등에 종속적이지 않고 독립적으로 실행할 수 있는 주체이다.
즉, Java 파일만 있다면 어떤 환경에서도 JVM 위에서 해당 파일을 실행할 수 있다.
또한, 프로그램의 메모리를 직접 관리해 메모리를 최적화 시킨다.
JVM은 크게 Class loader, Runtime Data Areas, Excution Engine 3가지로 구성된다.
출처 : https://thinkground.studio/자바-메모리-구조-java-memory-structure/Java 컴파일러로 컴파일된 Java 바이트 코드를 Runtime 시점에 JVM내로 가져오고 Runtime Data Area(JVM 메모리 영역)에 배치해주는 역할을 한다.
JVM의 메모리 영역에 해당하며 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 세분화된다.
Class Loader를 통해 Runtime Data Area영역에 배치된 바이트 코드를 실행하는 역할을 한다.
자바 소스 파일(.java)이 있다면 해당 파일을 Java Compiler가 JVM이 해석할 수 있는 파일인 Java ByteCode (.class)파일로 변환한다. Java Compiler는 Java 설치 시 Javac.exe라는 실행 파일 형태로 존재한다.
Java Compiler를 통해 만들어진 Java Bytecode (*.class)를 Class Loader를 통해 가져온 후 Runtime Data Area에 배치한다.
이후 Execution Engine에서 바이트코드를 기계어로 해석한다. Execution Engine은 인터프리터 방식 혹은 JIT(Just-In-Time) Compiler 방식이 있다.
Java 바이트 코드란 Java Source File (*.java)을 Java Compiler가 컴파일해 만든 파일이다.
Java Compiler에 의해 변환되는 코드의 명령어 크기가 1byte이기 때문에 Java 바이트코드라고 불린다.
Java 바이트 코드는 JVM이 해석할 수 있는 언어이며 *.class 확장자를 가진다.
JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어를 번역한다. 이렇게만 보면 인터프리터 방식과의 차이점이 없어보이지만 JIT 컴파일러는 같은 코드를 매번 해석하지 않고 기계어로 번역하면서 캐싱한다. 해당 파일이 다시 기계어로 컴파일 된다면 이전 파일과 비교해서 바뀐 부분은 새롭게 컴파일하고 변동 사항이 없는 부분은 캐싱된 코드를 사용한다.
이러한 방식은 인터프리터 속도가 느린 점을 JIT 컴파일러로 개선할 수 있는 장점이 된다.
JRE는 Java Runtime Environment의 약자로 다양한 운영체제에서 자바 프로그램이 실행되도록 도와주는 패키지이다. JRE 안에 JVM, Java 클래스 라이브러리, JIT 컴파일러 등이 JRE 패키지 안에 구성되어있다.
JDK는 Java Development Kit의 약자로 자바 프로그램 개발에 필요한 도구들의 집합체이다. JDK 안에 자바 실행에 필요한 JRE 뿐만 아니라 Java Compiler, 인터프리터 등이 JDK 패키지 안에 구성되어 있다.
즉, JDK는 JRE를 포함하고 있으며 자바 개발이 목적이라면 JDK가 필요하고 단순 java 파일을 실행 시키는 목적이라면 JRE만 있어도 된다.
https://medium.com/@lazysoul/jvm-이란-c142b01571f2
https://thinkground.studio/자바-메모리-구조-java-memory-structure/
https://velog.io/@dnjscksdn98/Java-What-is-JVM