목차
- JDK란
- JRE란
- JVM란
- Runtime Data Area
- JDK 동작 원리
JDK란
jdk는 Java Development Kit의 약어로, 자바 개발에 필요한 도구 모음을 의미합니다.

말 그대로 jdk 내부에는 자바 개발에 필요한 라이브러리들과 자바 컴파일에 필요한 javac, jar파일 제어에 필요한 jar 도구와 같은 개발 도구 들이 포함되어있습니다.
윈도우를 사용하는 경우 jdk를 다운 받은 뒤 jdk를 환경변수에 세팅을 해줘야 java, javac, jar와 같은 명령어를 사용할 수 있는것도 jdk 내부에 각 도구들이 포함되어있기 때문에 가능한 것입니다.


JDK프로그램 구성 요소

- bin - 자바 개발, 실행에 필요한 도구와 유틸리티 명령
- include - 네이티브 코드 프로그래밍에 필요한 C언어 헤더 파일
- lib - 실행에 필요한 라이브러리 클래스들

- javac - 자바 컴파일러, 자바 소스코드를 바이트 코드로 컴파일
- java - 자바 인터프리터, javac가 생성한 바이트 코드를 해석하고 실행
- jar - 자바 아카이브 파일(.jar) 도구, 자바 클래스 파일을 패키지화한 jar파일을 생성 및 관리하는 압축 도구
- javadoc - 자바 소스로부터 HTML형식의 API도큐먼트 생성
- jmod - 자바의 모듈 파일(.jmd)을 만들거나 모듈 파일의 내용 출력
- jlink - 응용프로그램에 맞춘 맞춤형 JRE생성
- jdb - 자바 응용프로그램의 실행 중 오류를 찾는 데 사용되는 디버거
- javap - 역어셈블러, 컴파일된 클래스 파일을 원래의 소스로 변환
JDK의 역할
jdk는 자바 개발에 필요한 도구들의 모음은 맞지만 더욱 자세히는 소스 코드를 컴파일 하는 역할을 합니다.
우리들이 흔히 intellij나 eclipse를 통해 java 프로그램을 개발할때 만드는 자바 파일(.java)은 개발하기 쉽도록 사람이 이해하기 쉽게 만들어진 고수준의 언어입니다.

jdk는 자바 컴파일러 도구인 javac를 이용해서 고수준 언어인 자바 프로그램 언어를 바이트 코드(.class)로 변경합니다. jar파일의 BOOT-INF에 포함되어 있는 클래스 파일이 바로 바이트 코드입니다.
컴파일된 바이트 코드는 JVM이 이해할 수 있는 형태로 구성되어 있어서 특정한 플랫폼(운영체제)에 얽메이지 않고 JVM만 존재한다면 바이트 코드를 실행시킬수 있는 독자적으로 실행시킬 수 있는 특징을 가지게 됩니다.
JRE란
JRE란 Java Runtime Environment의 약어로, JVM과 자바 프로그램이 실행하면서 필요한 라이브러리 API를 함께 묶어서 배포되는 패키지입니다.
JDK가 개발에 필요한 도구 모음이라면, JRE는 실행에 필요한 환경 모음입니다.
실행 환경 모음인 JRE를 구성하는 요소는 크게 JVM과 라이브러리 API입니다.
JVM은 자바 코드를 해석하는 가상머신입니다.
라이브러리 API는 java.lang, java.util과 같은 자바 개발에 핵심적인 라이브러리를 포함한 파일입니다.
JVM란
JVM은 Java Virtual Machine의 약어로, 자바를 실행시키는 프로그램이라는 뜻입니다.
컴파일된 바이트 코드를 실행하는 역할을 하는 JRE의 핵심이 바로 JVM입니다.
자바로 작성된 모든 프로그램은 JVM에 의해서만 동작이 가능하고 JVM만 있다면 어떤 플랫폼에서도 자바 프로그램이 동작이 가능합니다.

JVM 구성 요소
Class Loader

클래스 로더는 자바 클래스 파일(컴파일된 .class파일)을 메모리에 적재하고, 런타임에 필요한 클래스들을 동적으로 로딩합니다.
클래스 로더의 동작 과정은 3가지 동작으로 나누어집니다.
- 로딩(loading) - 바이트 코드를 메모리에 적재
- 링크(linking) - 래퍼런스 해결 및 검증
- 초기화(initialization) - 정적 초기화 블록 실행
Runtime Data Area
JVM은 프로그램을 실행하기 위해 메모리를 여러 영역으로 나누어 관리합니다.
개발자가 작성한 클래스 정보 및 메소드 데이터 그리고 로컬 변수, 객체 등을 저장하는 등 다양한 데이터를 여러 영역에 목적과 역할에 맞게 저장 및 관리됩니다.
해당 메모리 영역은 자바 프로그램을 실행하기 위해 JVM이 OS에게서 할당받은 별도의 메모리 공간입니다.
아래에서 자세히 다루겠습니다.
Execution Engine
실행 엔진은 바이트코드를 실제로 실행하는 역할을 합니다.

주요 구성 요소는 아래와 같습니다.
- 인터프리터
- 바이트코드를 한 줄씩 운영체제가 이해할 수 있는 기계어로 해석 후 즉시 실행
- 인터프리터 방식은 느리기 때문에 JIT 컴파일러에 의해 최적화 됩니다.
- 가비지 컬렉터
- 사용하지 않는 객체를 메모리에서 제거합니다.
- JIT(Just In Time) 컴파일러
- 같은 코드를 매번 해석하지 않고, 해석한 코드를 캐싱해 두었다가 바뀐 부분만 컴파일 하고 동일한 코드는 캐싱된 코드를 사용합니다.
- JIT 컴파일을 사용하는 방법을 동적 번역이라 하며, 인터프리터 방식보다 10~20배 정도 더 좋다고 합니다.

JVM의 동작
- JVM 실행
- JDK에 의해 만들어진 jar파일이 JVM 실행
- ex) java -jar DemoApplication-0.0.1-SNAPSHOT.jar
- MANIFEST.MF 읽기
- JVM은 jar파일 내부의 META-INF/MANIFEST.MF 파일을 읽어서 Main-Class 속성을 확인합니다.
- spring boot 실행이라면 JarLauncher 로더 클래스를 확인합니다.
- Main-Class - JarLauncher 로더 클래스
- Start-Class - main메서드가 있는 클래스
- 클래스 로더 작동
- 클래스 로더가 작동하여 jar파일의 Main-Class에 해당하는 바이트코드(.class 파일)를 jar파일의 BOOT-INF에서 찾아 메모리에 로드합니다.
- spring boot의 경우 Main-Class에 정의된 JarLuncher가 jar내부의 BOOT-INF 디렉터리를 분석하고 Start-Class속성(main메서드가 있는 클래스)을 읽어 메모리에 로드합니다.
- 클래스 로더가 작동하여 jar파일의 Main-Class에 해당하는 바이트코드(.class 파일)를 jar파일의 BOOT-INF에서 찾아 메모리에 로드합니다.
- 바이트 코드 실행
- 인터프리터 방식에 의해 메모리에 로드된 바이트코드를 한 줄씩 읽어서 운영체제가 읽을 수 있는 기계어로 컴파일 되고 즉시 실행됩니다.
- 자주 사용되는 코드는 처음에는 인터프리터에 의해 컴파일 되고 JIT컴파일러에 의해 캐싱되어 사용되어 성능이 개선됩니다.
- 애플리케이션 실행
- main메서드를 가진 클래스가 실행 엔진(Execution Engine)에 의해 실행되어 운영체제 위에서 애플리케이션이 정상적으로 동작하게 됩니다.
Runtime Data Area
Runtime Data Area는 자바 프로그램을 실행하기 위해 JVM이 운영체제에 할당받은 메모리 공간입니다.
자바 프로그램 실행에 필요한 클래스 파일을 저장하는 영역, 런타임에 생성된 객체를 저장하는 영역 등 다양한 데이터들이 메모리 영역에 목적에 맞게 각 영역에 저장되고 관리되고 있습니다.

메모리 영역 구성 요소
스레드(Thread) 영역
- PC 레지스터(PC Register)
- 스레드가 실행 중인 JVM 명령어 주소를 저장하는 영역
- 스택(Stack)
- 각 스레드가 사용하는 메서드 호출과 관련된 로컬 변수 및 메서드 호출 기록을 저장하는 영역
- 메서드 종료시 삭제
- 네이티브 메소드 스택
- 자바를 제외한 외부의 네이티브 코드(C, C++)를 호출할 때 사용하는 영역
힙(Heap) 영역
- 런타임에 생성된 객체를 저장하는 메모리 영역, 가비지 컬렉션의 타겟이 되는 영역
- 모든 스레드가 공유하는 영역
메서드(Method) 영역
- 클래스, 메서드, static 변수 등을 저장하는 영역
JDK 동작 원리
개발자가 작성한 자바 프로그래밍 언어(고급 언어)가 운영체제가 읽을 수 있는 기계어로 번역되어 실행되는 과정을 정리해보겠습니다.
JDK 동작은 크게 3가지로 나누어져 있습니다.
- 컴파일 및 패키징(JDK 역할)
- 실행 및 로딩(JRE,JVM 역할)
- 애플리케이션 실행(실행 엔진 역할)
위의 3가지 동작을 기준으로 Jar파일이 패키징 되고 애플리케이션이 실행되는 과정은 아래와 같습니다.
- 개발자가 자바 프로그래밍 언어(고급언어)로 프로그램 개발
- JDK의 컴파일러 javac를 통해 바이트 코드로 컴파일 및 패키징(Jar파일 생성)
- 패키징
- 순수 자바 프로그램은 plain jar
- spring boot 애플리케이션은 executable jar
- 컴파일
- jar파일의 BOOT-INF/classes 파일에 바이너리 코드 저장
- 패키징
- JDK로 JVM에 Jar파일 실행
- Java -jar DemoApplication.jar 명령어 실행
- JVM의 클래스 로더에 의해 메인 클래스를 메모리에 로드
- Jar의 META-INFO/MANIFEST.MF파일을 읽어서 main메서드가 있는 클래스를 찾아 메모리 영역에 저장
- Plain jar의 경우 Main-Class에 정의된 클래스
- Executable jar의 경우 Main-Class에 정의된 JarLauncher 클래스 로더를 메모리에 로드 해당 클래스 로더가 Start-Class에 정의된 클래스를 메모리에 로드
- 런타임에 Jar의 BOOT-INFO/lib 및 BOOT-INF/classess 내용을 클래스 로더가 동적으로 로드
- Jar의 META-INFO/MANIFEST.MF파일을 읽어서 main메서드가 있는 클래스를 찾아 메모리 영역에 저장
- 실행 엔진에 의해 애플리케이션 실행
- 인터프리터 방식으로 실행해야할 바이트 코드를 한 줄씩 기계어(바이너리 코드)로 컴파일 하여 즉시 운영체제에서 명령을 수행.
- 자주 실행되는 코드는 JIT 컴파일러가 탐지해서 기계어로 캐싱해 둔 다음 다음 호출 때 캐싱된 코드를 사용하여 실행 속도가 빨라짐. (최적화)
참고
☕ JDK / JRE / JVM 개념 & 구성 원리 💯 총정리
자바를 처음 설치하면 C:\Program Files\Java 폴더에 아래와 같이 JDK와 JRE 가 각각 설치되는 것을 볼 수 있다. 그렇다면 이 JDK와 JRE의 역할은 무엇인지 그리고 자바 프로그램(JVM)은 어떤식으로 돌아가
inpa.tistory.com
[study] 바이트 코드(Bytecode)란? [JVM에서 실행될 수 있는 실행 가능한 기계어 코드]
- 바이트 코드(Bytecode)란? 자바 가상 머신(JVM)에서 실행될 수 있는 실행 가능한 기계어 코드 자바 소스 코드(.java)가 javac를 사용하여 컴파일되면, 컴파일된 바이트 코드 파일(.class)은 JVM에서 실행
yermi.tistory.com
[study] javac란 무엇인가? [자바 컴파일러(Java Compiler)]
- javac란 무엇인가? 자바 컴파일러(Java Compiler) 자바 프로그래밍 언어는 고수준 언어로, 사람이 이해할 수 있는 코드를 작성하면 컴퓨터가 실행 가능한 기계어 코드로 변환되어야 한다. 이 변환 작
yermi.tistory.com
https://fabric0de.tistory.com/58
[Java] JVM : Java Virtual Machine
JVM이란 무엇인가?JVM(Java Virtual Machine)은 자바 프로그램을 실행하기 위한 가상 머신이다. 자바는 플랫폼 독립적인 언어인데, 이는 자바 코드가 특정 운영체제나 하드웨어에 종속되지 않기 때문이
fabric0de.tistory.com
'cs > java' 카테고리의 다른 글
| [java] OOP (0) | 2025.10.20 |
|---|