Learning Objectives (학습 목표)
- Before studying Java further, it's important to understand how Java is executed.
Java를 더 공부하기 전에, 애초에 Java가 어떻게 실행되는 지 알기위함.
- We need to understand what JDK, JVM, JRE, and JIT are.
JDK, JVM, JRE, JIT가 무엇인지 알아야겠다.
What is JDK? (JDK란 무엇인가?)
JDK = Java Development Kit
Java application을 실행하고 개발하기 위해 사용되는 도구로 구성되어 있다. Java를 통해 개발하고 실행하기 전에, 컴퓨터/시스템에 JDK를 설치해야 한다.

JDK는 JRE와 Java Development Tools (interpreter/loader, compiler, debugger, an archiver (jar)) 로 구성되어 있다.
What is JRE? (JRE란 무엇인가?)
JRE = Java Runtime Environment
장치에서 Java 프로그램 실행을 위한 환경이다. 오직 Java 실행을 위해서만 사용된다.
What is JVM? (JVM이란 무엇인가?)
JVM = Java Virtual Machine
Java의 런타임 엔진이다. Java의 코드를 line-by-line으로 실행한다. 또한, Interpreter이기도 하다.
How JDK Compile and Run Java Code? (JDK는 어떻게 Java 코드를 실행하는가?)
- Java Compiler (Javac → Development tools)는 Java 파일 (.java)을 실행가능한 파일로 전환한다. 이 실행 파일은 운영체제에서 직접 실행할 수 없다. 실제로 이 파일은 중간의 파일로,
Bytecode라고 불리며 확장자는 .class 이다.
Bytecode 는 모든 운영체제(Mac, Windows, and Linux 등)에서 지원된다.
Bytecode 를 실행하기 위해 JVM 이 필요한 것이다. Java 컴파일러가 JVM으로 Bytecode 파일을 전달한다. (JVM은 각 운영체제마다 다르며 운영체제마다 호환되는 JVM 필요)
- Class Loader
- Bytecode Verified
- Java-In-Time Compiler
Heap Area (힙 영역)
JVM 메모리의 일부로, 모든 객체 정보가 Heap 영역에 저장된다.
Class Loader run 3 process :
- Loading
- Linking
- Initializing
- Loading (로딩)
Bytecode는 메소드 영역에 저장되고 클래스가 메모리에 로딩된다.
메소드 영역은 JVM 메모리의 일부분이며, 모든 클래스 이름, parent 클래스 이름, 메소드, 변수 정보가 저장된다.
- Linking (연결)
클래스와 인터페이스가 JVM 내에서 런타임 상태로 결합된다. 즉, 실행할 수 있게 된다.
3.Initialization (초기화)
이전 섹션의 연결 클래스가 실행된다.
클래스 로더 프로세스에 대해 더 잘 이해해보자.
- Loading (로딩) → 클래스 파일을 가져와서, JVM 메모리에 로딩한다.
- 검증 → 자바 언어 명세 및 JVM 명세서에 명시된 대로 구성되어 있는지 검사한다.
- 프로그램에서 선언하지 않은 변수 사용하거나, overflows하면 예외 발생시키고 컴파일링 중지.
- 준비 → 클래스가 필요로하는 메모리 할당한다. (필드, 메서드, 인터페이스 등)
- 분석 → 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변환한다.
- 초기화 → 클래스 변수들을 적절한 값으로 초기화한다.
Final Execution Step
- Interpreter: Bytecode를 한 줄 한 줄 해석하고 실행한다.
- Just-In-Time Compiler : 전체 Bytecode를 컴파일하고, 머신 코드로 변환한다.
- Garbage Collector: 참조되지 않은 객체를 파괴한다.
The compile process is done!
Summary
- 개발자가 자바 소스코드를( .java) 작성한다.
- 자바 컴파일러(Java compiler)가 자바 소스파일을 컴파일한다. → 이 때 파일은 Bytecode (.class) 파일로, 컴퓨터가 읽을 수 없는 JVM만이 이해할 수 있는 코드이다.
- 컴파일 된 Bytecode (컴파일러에 의해)를 JVM의 클래스 로더(Class Loader)에게 전달한다.
- 클래스 로더(Class Loader)는 동적 로딩을 통해 → 클래스들을 로딩,링크하여 JVM 메모리 영역에 올린다.
- 실행 엔진 → JVM 메모리에 올라온 Bytecode를 명령어 단위로 하나씩 가져와서 실행한다.
- 인터프리터: Bytecode 명령어를 line-by-line 읽어서 해석하고 실행한다.
- JIT (Just-In-Time) 컴파일러: 인터프리터 단점을 보완하기 위해 도입됨. Bytecode 전체를 컴파일 하여 바이너리 코드로 변경하고, 이후에는 메서드를 인터프리팅하지 않고, 바이너리 코드로 직접 실행한다. → 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적 실행 속도가 인터프리팅 방식보다 빠르다.