본문 바로가기
Study/Language

[Java] SDK, JVM, JDK, JRE, JIT ... ?

by jamiehun 2023. 2. 19.

자바를 공부하다보면 만나는 여러가지 용어들.

한번 정리해봤다.

 

https://docs.oracle.com/javase/8/docs/index.html

 

JDK, JRE, JVM은 자바 플랫폼을 구성하고 있는 3대 요소이다.

일단 세가지부터 알아보기로 한다.

 

일단 제일 큰 단위인 JDK부터,

 

JDK

Java Development Kit

JDK를 얘기하기 전에 SDK부터 알아보자,

SDK는 Software Development Kit의 약자로

우리가 흔히 쓰는 API, IDE, 각종 문서, 라이브러리, 코드샘플 및 기타 유틸리티가 포함되어 있다.

 

JDK는 JAVA Development Kit의 약자이고

Java 환경에서 돌아가는 프로그램을 개발하는데 필요한 tool들을 모아놓은 package라고 보면 될 것 같다.

예를 들어, JRE, Java 바이트코드 컴파일러, JVM 등이 모두 포함된다.

대표적인 JDK로는 OpenJDK, IBM JDK 등이 있다.

 

JRE

Java Runtime Environment

런타임 환경은 소프트웨어 프로그램 실행을 위해 파일을 로드하고 메모리 등에 대한 접근을 하는 등의 일련의 과정이다. 

런타임환경에서는 대부분의 소프트웨어가 운영체제를 사용한다.

하지만 자바의 경우 WORA ("Write Once, Run Anywhere")라는 모토를 가지고 있기 때문에 

컴퓨터 운영체제 위에서 실행되면서 자바를 위한 부가적인 소프트웨어 계층이 필요하다. (OS에 의존적이지 않음)

JRE는 OS 상에서 실행되고 클래스 라이브러리, 특정 자바 프로그램이 실행해야하는 기타 리소스를 제공하는 소프트웨어 계층.

 

JRE에는 JVM, Java Class Libraries, Java Class Loader로 구성되어 있다.

 

JVM

Java Virtual Machine 

한마디로 말하면 Java로 개발한 프로그램을 컴파일하여 만들어지는 바이트 코드를 실행하기 위한 가상머신이다.

JVM이 실행가능한 환경에서는 어디서든 Java 프로그램이 실행가능하다. 이로 인해 Java의 WORA가 가능하게 된다.

 

Java 프로그램의 실행 순서를 보자면

1. Java의 소스코드가 javac 컴파일러를 거쳐 바이트코드로 변환

2. 바이트코드가 Java ClassLoader에 의해 JVM에 적재

3. JVM은 적재된 바이트코드를 JIT 컴파일 방식으로 실행

 

바이트코드? Java ClassLoader? JIT? 이것들은 또 무엇일까..?

조금만 더 알아보자

 

바이트코드

ByteCode

고급언어로 작성된 소스코드를 가상머신이 이해할 수 있는 중간코드로 컴파일 한 것으로 

VM은 이 바이트코드를 각각의 하드웨어 아키텍처에 맞는 기계어로 다시 컴파일해야한다.

이 바이트코드는 어셈블리어에 가까운 형태를 띄고 있다. 

 

고급언어 - 바이트코드 - 어셈블리어 와 같이 중간 단계에 있는 코드로

VM을 위한 코드라고 보면 될 것 같다.

 

Java Class Libraries (JCL)

JRE의 구성요소 중 하나로 동적으로 로딩이 가능한 라이브러리이다. (Runtime에 로딩)

자바플랫폼이 OS에 의존적이지 않기 때문에 OS에서 제공하는 라이브러리에 의존하지 못한다.

따라서 자바는 표준 클래스 라이브러리를 통해 OS에서 제공하는 native 라이브러리 대신 공통적인 기능들을 제공한다.

 

Java Class Loader

자바 클래스로더는 바이트코드(자바클래스)를 런타임에 동적으로 JVM에 동적으로 적재한다.

Java Class Loader로 인해 JVM은 파일이나 파일 시스템에 관한 사항을 굳이 알 필요가 없다.

Class Loader가 대신해서 적재하는 역할을 해주기 때문이다. 

JVM은 "실행"에만 초점을 맞출 수 있다.

 

JIT(Just-in-Time)

C나 C++같이 프로그램을 실행하기 전에 처음 한번 컴파일 하는 대신,

프로그램을 실행하는 시점에서 필요한 부분을 즉석으로 컴파일하는 방식을 말한다.

보통 자바와 같은 인터프리터 방식의 언어 구현들이 성능향상을 목적으로 이러한 전략을 도입하는 경우가 많다.

 

 

 

 

[참고자료]

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

https://namu.wiki/w/%EC%9E%90%EB%B0%94%20%EA%B0%80%EC%83%81%20%EB%A8%B8%EC%8B%A0?from=Java%20Virtual%20Machine 

https://en.wikipedia.org/wiki/Java_Class_Library

https://simplycoding.in/java-class-libraries-and-packages/

https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre 

https://www.ibm.com/kr-ko/cloud/learn/jre 

https://www.redhat.com/en/topics/cloud-native-apps/what-is-a-Java-runtime-environment

https://developerntraveler.tistory.com/49