JDK/JRE/JVM 개념
[ 목차 ]
JDK, JRE, JVM의 개념과 역할
- JDK(Java Development Kit): Java 애플리케이션 개발 및 실행을 위한 소프트웨어 개발 키트. 개발 도구와 JRE를 포함.
- JRE(Java Runtime Environment): Java 애플리케이션을 실행하기 위한 환경. JVM과 표준 라이브러리를 포함.
- JVM(Java Virtual Machine): Java 바이트코드를 실행하는 가상 머신. 플랫폼 독립성을 실현하는 핵심 요소.
JDK(Java Development Kit)
JDK의 정의와 역할
JDK는 Java 애플리케이션을 개발하고 실행할 수 있는 도구 모음이다. Java 프로그램을 작성, 컴파일, 디버깅 및 실행하는 데 필수적인 도구다.
JDK의 버전 표기
- JDK는 버전 번호로 구분된다. 예: JDK 8, JDK 11, JDK 17.
- LTS(Long-Term Support): JDK 8, 11, 17은 장기 지원(LTS) 버전으로 기업에서 주로 사용다.
JDK 디렉토리 구성요소
- bin : 자바 개발, 실행에 필요한 도구와 유틸리티 명령, javac(컴파일러), java(런처) 등 실행 파일.
- lib : 클래스 라이브러리와 리소스 파일.
- include : 네이티브 코드 프로그래밍에 필요한 C/C++ 헤더 파일.
JDK와 JRE의 호환성
- JDK와 JRE 간의 호환성은 JDK가 제공하는 컴파일러 버전에 따라 달라질 수 있다.
- JDK 17에서 컴파일된 코드를 JRE 8에서 실행하려면 javac --release 8과 같은 옵션을 사용하여 호환성을 유지해야 한다.
JRE(Java Runtime Environment)
JRE의 정의와 역할
JRE는 Java 애플리케이션 실행 환경의 약자이다. JVM과 표준 라이브러리를 포함하며, Java 프로그램을 실행하는 데 필요한 모든 요소를 제공한다. 이외에도 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일(jar 파일)을 가지고 있다.
JRE는 기본적으로 JDK에 포함되어 있기 때문에 JDK를 설치하면 함께 설치된다.
JDK와 JRE의 차이
특징 | JDK | JRE |
역할 | 개발과 실행 | 실행만 가능 |
구성 요소 | JRE 포함, 컴파일러, 디버거 | JVM과 클래스 라이브러리 |
대상 사용자 | 개발자 | 일반 사용자 |
JVM(Java Virtual Machine)
JVM의 정의와 필요성
JVM은 Java 바이트코드를 실행하는 가상 머신이다. JVM은 Java의 플랫폼 독립성을 실현하며, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다,
- 플랫폼 독립성 제공: 운영체제와 무관하게 Java 프로그램 실행 가능.
- 메모리 관리: 자동으로 메모리를 할당하고 Garbage Collection으로 회수.
- 보안: Java 프로그램을 안전하게 실행.
- C 언어와의 비교:
- C 언어는 컴파일 시 운영체제에 종속된 기계어로 변환되기 때문에 플랫폼 종속적이다.
- Java는 JVM 위에서 바이트코드를 실행하므로 플랫폼 독립성을 가진다. 이는 한 번 작성한 코드가 여러 환경에서 실행될 수 있는 장점을 제공다.
JVM의 내부 구조
- 클래스 로더(Class Loader):
- Java 프로그램 실행 시 필요한 클래스를 메모리에 로드.
- 부트스트랩 로더, 확장 로더, 애플리케이션 로더로 구성.
- 실행 엔진(Execution Engine):
- 인터프리터: 바이트코드를 한 줄씩 실행.
- JIT(Just-In-Time) 컴파일러: 바이트코드를 네이티브 코드로 변환하여 실행 속도 향상.
- 메모리 영역:
- 메소드 영역(Method Area): 클래스 메타데이터 저장.
- 힙(Heap): 객체와 인스턴스 변수 저장.
- Young Generation: 새롭게 생성된 객체가 저장되는 영역.
- Old Generation: Young Generation에서 오래 살아남은 객체가 이동.
- Metaspace: 클래스 메타데이터 저장.
- 스택(Stack): 메소드 호출과 지역 변수 저장. 각 스레드마다 독립적으로 할당.
- PC 레지스터: 현재 실행 중인 명령어 주소 저장.
- 네이티브 메소드 스택: 네이티브 코드 호출 관리.
JVM의 플랫폼 독립성을 보장하는 원리
- Java 소스 코드는 바이트코드로 컴파일된다.
- JVM은 각 운영 체제에 맞는 네이티브 코드를 생성하여 실행.
자바 프로그램의 실행 과정
Java 프로그램이 실행되는 과정
- 소스 코드 작성: .java 파일 생성.
- 컴파일: javac를 사용하여 Java 소스 코드를 바이트코드(.class 파일)로 변환.
- 클래스 로딩: JVM의 클래스 로더가 .class 파일을 메모리에 로드.
- 바이트코드 실행:
- 인터프리터 또는 JIT 컴파일러가 바이트코드를 네이티브 코드로 변환.
- 실행 엔진이 네이티브 코드를 실행.
- 메모리 관리: JVM이 Garbage Collection으로 메모리 회수.
.java → javac → .class → JVM → 실행
자바 프로그램의 실행 속도와 JIT 컴파일
- Java 프로그램은 인터프리터를 통해 실행되므로 초기 실행 속도가 C 언어에 비해 느릴 수 있다.
- 이러한 단점을 보완하기 위해 JIT(Just-In-Time) 컴파일러가 도입되었다.
- JIT 컴파일러는 자주 실행되는 코드를 네이티브 코드로 변환하여 실행 속도를 최적화한다.
클래스 로더 체계
- 부트스트랩 로더: 표준 라이브러리 클래스 로드.
- 확장 로더: 사용자 지정 확장 클래스 로드.
- 애플리케이션 로더: 애플리케이션 클래스 로드.
JIT 컴파일과 인터프리터
- 인터프리터 : 바이트코드를 한 줄씩 실행하여 빠르게 시작. 하지만 같은 메소드라도 여러 번 호출이 된다면 매번 해석하고 수행해야 되서 전체적인 속도는 느리다.
- JIT 컴파일러 : 인터프리터의 단점을 보완하기 위해 도입된 방식, 자주 실행되는 코드를 네이티브 코드로 변환하여 실행 속도 최적화.
Garbage Collection 소개
Garbage Collection(GC)은 Java의 자동 메모리 관리 시스템이다. GC는 더 이상 참조되지 않는 객체를 힙 메모리에서 제거하여 메모리를 효율적으로 관리다.
GC 안에서의 역할
- Young Generation: 새로 생성된 객체를 관리하며, Minor GC가 주기적으로 실행.
- Old Generation: 오래된 객체를 관리하며, Major GC가 실행.
Stop-the-World 이벤트
GC가 실행될 때 JVM은 모든 애플리케이션 스레드를 멈추고 메모리를 정리합니다. 이 과정은 짧지만, 성능에 영향을 줄 수 있다.

JDK, JRE, JVM의 관계
JDK, JRE, JVM은 서로 밀접하게 연결되어 있다:
- JDK: 개발 도구와 함께 JRE를 포함.
- JRE: JVM과 클래스 라이브러리를 포함.
- JVM: 바이트코드를 실행하여 플랫폼 독립성을 제공.
출처
☕ JDK / JRE / JVM 개념 & 구성 원리 💯 총정리
자바를 처음 설치하면 C:\Program Files\Java 폴더에 아래와 같이 JDK와 JRE 가 각각 설치되는 것을 볼 수 있다. 그렇다면 이 JDK와 JRE의 역할은 무엇인지 그리고 자바 프로그램(JVM)은 어떤식으로 돌아가
inpa.tistory.com
[JAVA] JDK, JRE, JVM 차이 및 개념 이해하기
JDK (Java Development Kit)JDK는 자바 개발 키트의 약자로 개발자들이 자바로 개발하는 데 사용되는 SDK 키트이다.📌 SDK 란 Software Development Kit의 약자로, 소프트웨어 개발을 위해 도구와 라이브러리, 문
kylo8.tistory.com
[JAVA] 자바 프로그램 실행 과정 및 기본 구조
1. 자바 프로그램 실행 과정 1.1. JVM 2. 자바의 기본 구조 3. 자바 프로그램 분석 1. 자바 프로그램 실행 과정 Java언어로 프로그래밍된 파일을 Java컴파일러가 가상 기계어 파일인 Java클래스 파일로
pienguin.tistory.com