[Java] JDK, JRE, JVM 개념 정리

toget ㅣ 2023. 10. 3. 10:06

개요

자바 개발 키트(Java Development Kit, JDK), 자바 가상 머신(Java Virtual Machine, JVM), 자바 런타임 환경(Java Runtime Environment, JRE)은 자바 애플리케이션을 개발하고 실행하기 위한 *자바 플랫폼의 3대 구성 요소다.

*자바 플랫폼

 

핵심 내용

 

각 용어 상관관계(범위)

JDK는 사진과 같이 JVM < JRE < JDK 순으로 범위안에 존재한다.

그래서 JDK를 설치했을 때 많은 프로그램중에서 JVM 프로그램이 깔려 java를 사용할 수 있는 것이다.

 

요약

- JVM은 프로그램을 실행하는 자바 플랫폼 구성요소이다.

- JRE는 JVM을 생성하는 디스크 상의 부분이다.

- JDK는 개발자들이 JVM과 JRE에 의해 실행되고 구동될 수 있는 자바 프로그램을 생성할 수 있게 해준다.

 

JDK (Java Development Kit)

자바 개발 키트(Java Development Kit, JDK)란 자바 플렛폼(자바 SE, EE, 또는 ME)의 환경을 구현한 것으로 자바 기반의 소프트웨어를 개발하기 위한 도구들로 이뤄진 패키지이다.

 

파일 구성

 

크게 6가지 파일들로 구성되있으며, 파일 위치와 구성은 다음과 같다.

 

•실행 파일(bin/)

자바 실행환경(Java Runtime Environment, JRE)를 구현한 것으로, 자바 가상 머신, 클래스 라이브러리[1], 자바 언어로 작성된 프로그램 작동에 필요한 파일을 포함하고 있으며, 같은 위치에 프로그램 개발에 필요한 모든 툴과 유틸리티 포함되어있다.

•구성 파일 (conf/)

사용자 구성 옵션을 포함하고 있는 파일들로써, JDK 접근 권한 설정, 보안 알고리즘 변경, 자바 암호화 확장 정책 등을 설정할 수 있다.

• C 헤더 파일 (include/)

자바 가상머신 디버거인터페이스와 자바네이티브인터페이스의 네이티브 코드를 작성하는데 사용되는 C헤더 파일

• 자바 모듈 (jmods/)

jlink를 이용하여 사용자 지정 런타임을 만드는데 사용되는 모듈.

• 저작권 및 라이선스 (legal/)

각 모듈에 대한 라이선스와 저작권에 대한 내용, 제삼자 제공 포함.

• 추가 라이브러리 (lib/)

JDK에 필요한 추가 클라스 라이브러리와 지원 파일 (외부 사용을 목적으로 하지 않음)

 

JRE (Java Runtime Environment)

자바 런타임 환경이란, 컴퓨터 운영체제 위에서 실행되며 자바 프로그램을 실행하는데 필요한 클래스 라이브러리(JCL, etc) 및 기타 소스를 제공하는 소프트웨어이며, JRE만 따로 설치가 가능하다.

 

JCL(Java Class Library)

Java에서 기본적으로 제공하는 라이브러리

• GUI 및 그래픽 : java.awt 패키지로 WindowsOS 환경에서 Java 언어로 GUI와 2차원 그래픽을 그리는데 사용되는 API 제공

• 문자 : java.lang 패키지로 Java에서 문자와 관련되 API 제공

• 입출력 : java.io, java.nio 등 파일 입출력과 콘솔 입출력, 네트워크와 관련된 AIP 제공

• 수학 : java.math 패키지로 수학과 관련된 API 제공

• XML : java.xml 패키지로 XML 처리를 위한 API 제공

• JDBC(Java DataBase Connectivity) : java.sql 패키지로 자바에서 데이터베이스에 접근하는 API 제공

더 많은 데이터 :https://docs.oracle.com/en/java/javase/11/docs/api/index.html

 

 

JVM (Java Virtual Machine)

자바 가상 머신(Java Virtual Machine)은 Java로 작성된 코드 또는 애플리케이션을 구동할 때 사용되는 런타임 환경을 제공하는 엔진이다. 간략하게 Java byte 코드를 기계언어로 변환한다. 다른 프로그래밍 언어의 컴파일러는 구동되는 코드를 각 시스템에 대한 기계어 코드로 변환하지만, Java 컴파일러는 JVM에서 작동하는 byte코드로 변환합니다.

 

JVM은 각 운영체제와 CPU 구조에 맞게 다운로드 받아야하기 때문에, 시스템에 종속적이라고 할 수있지만, 변환된 Java 코드는 시스템에 독립적이라고 볼 수 있습니다.

JVM 구조

 

 

1.Class Loader

클래스 로더는 Java 컴파일러로 컴파일한 후 생성된 byte 코드파일(.class)들을 JVM 메모리(또는 Runtime Date Area)에 적재하는 JVM의 하위 시스템이다. 세가지 주요 기능을 수행합니다. Loading, Lnking, Initialization

 

2.Class Method Areaclass

데이터가 저장되는 JVM의 데이터 영역 중 하나입니다. static variables, static blocks, static method, intsance method 등 이 이곳에 저장됩니다.

 

3.Heap

모든 new예약어로 생성된 Object와 그것과 관련된 Instance variable과 array는 Heap에 저장된다. Class Method Area에 적재된 Class만 생성가능하다. 이 메모리영역은 여러 thread에서 공유됩니다.

 

4.JVM Language Stacks

Language Stacks는 local variable을 저장한다. Heap 영역에 생성된 Object의 메모리 주소값을 저장하고 있다. thread는 그에 맞는 JVM stack이 있다. 코드블럭을 만나면 stack prime을 생성하고 블러기 끝나면 stack prime이 사라진다.

 

5.PC Registers(Program Counter Regisers)

일반적인 컴퓨터 구조 용어로써 다음에 실행할 명령어의 주소를 가지고 있다. tread가 생성될 때 함께 생성된다.

 

6.Native Method Stacks

JVM에서 작동하는 언어 외에 다른 언어(C, etc)로 작성한 Method를 저장하는 공간이다.

 

7.Execution EngineExecution

Engine은 ClassLoader를 통해 JVM Memory(또는 Runtime data Area)영역에 할당된 byte코드를 실행한다.엔진은 InterPreter, JIT Compiler로 이루어져 있다.

 

*Interpreter

byte코드를 순차적으로 한줄씩 읽어 즉지 기계어로 변환하여 실행한다.

 

*JIT Compiler(Just-In -Time Compiler) : JVM이 byte코드를 Interpreter로 즉시 해석하여 실행함과 동시에 JIT Compiler는 byte코드 중 필요한 부분을 컴파일하여 기계어로 변환하고 Interpreter가 같은 함수를 여러번 기계어로 변환하는 것을 방지한다. Interpreter의 속도를 보완하기 위해 도입된 compile 기법이다.

 

*Garbage Collector

JVM은Garbage Collection을 수행하며, 이것은 메모리 관리 기법 중 하나로 프로그램이 동적으로 할당했던(JVM에서 Heap영역에 해당) 메모리 영역 중 필요없게 된 영역을 자동으로 해제하는 기능을 한다. 이미 해제된 메모리에 접근하거나 더 이상 필요하지 않은 메모리가 해제되지 않고 남아있는 등 메모리 관련 버그를 막을 수 있다. 반면 어떤 메모리를 해제할지 결정하는데 드는 자원이 필요하다는 등의 단점도 갖고 있다.

 

 

출처:https://betterdev.tistory.com/2#--%--JVM-Java%--Virtual%--Machine-%EC%-D%B-%EB%-E%--%--%EB%AC%B-%EC%--%--%EC%-D%B-%EA%B-%--%-F

https://www.itworld.co.kr/news/110817

href="https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%9C%EB%B0%9C_%ED%82%A4%ED%8A%B8">https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%9C%EB%B0%9C_%ED%82%A4%ED%8A%B8