자바 개발자라면 JVM, JRE, JDK는 필연적으로 마주하게 되는 용어인 것 같습니다. 이들이 왜 존재하고 어떻게 동작하는지, 어떤 차이점이 있는지 개념적으로만 간단하게 정리해보고자 합니다.
JVM (Java Virtual Machine) - 자바 가상 머신
기계(Machine)는 "동력에 의해 일정한 일을 하는 도구"라는 뜻을 가지고 있죠. JVM도 마찬가지입니다. 다만 JVM의 역할은 자바 코드(.java)가 컴파일되어 만들어진 자바 바이트코드(.class)를 하드웨어가 이해할 수 있도록 기계어로 번역을 해주는 것이죠.
[Java] 자바(Java)의 역사에서 언급했듯, 자바 이전에는 컴파일된 코드가 플랫폼(또는 OS)와 CPU에 종속적이어서, 한번 컴파일된 파일로 다른 플랫폼이나 하드웨어 환경에서 실행할 수가 없었습니다. 따라서 개발할 때 시간과 비용이 많이들었죠. 하지만 JVM은 한번 컴파일된 자바 바이트코드(.class)를 플랫폼과 하드웨어에 관계없이 어디에서든 실행될 수 있도록 (WORA - Write Once, Run Anywhere) 해줌으로써 큰 장점이 생긴것이죠.
이처럼 Java는 플랫폼에 의존적이지 않게되었지만, JVM은 플랫폼에 의존적입니다. 즉 리눅스의 JVM과 윈도우의 JVM은 서로 다릅니다. 하지만 오라클은 대부분의 주요 운영체제뿐만 아니라 웹 브라우저, 스마트 폰, 가전기기 등에서도 자바 가상 머신을 손쉽게 설치할 수 있도록 지원하고 있습니다.
JRE (Java Runtime Environment) - 자바 실행 환경
위 설명처럼 JVM이 실질적으로 코드를 실행하는 역할을 담당하지만, JVM만 가지고는 자바 프로그램을 동작시킬 수 없습니다. 프로그램을 실행시키기 위해서는 실행 환경이 구축되어 있어야하기 때문이죠. 예를 들어 소프트웨어를 실행시키기 위해서는 클래스 파일을 로드하거나 메모리 및 기타 시스템 리소스를 관리하는 서비스가 필요한데, 이런 서비스를 제공해 주는 것이 JRE 입니다.
따라서 JRE는 자바가 실행되기 위해 필요한 환경을 제공합니다. 더 정확하게 말하면 JVM이 자바 프로그램을 실행시키기 위해 필요한 라이브러리와 기타 파일을 포함하고 있죠. 대표적으로 JVM, 자바 클래스 라이브러리, 자바 클래스 로더를 포함하고 있습니다. 자바 클래스 로더와 자바 클래스 라이브러리를 통해 작성된 자바 코드를 라이브러리와 결합 후에 JVM으로 넘겨서 실행을 시킵니다. 따라서 JRE는 그 자체로 기능이 있다기보다는 JVM이 동작하기 위한 환경을 뜻합니다.
JDK (Java Development Kit) - 자바 개발 키트
JDK는 이름 그대로 개발자들이 자바로 프로그램을 개발하는데 필요한 모든 라이브러리 및 파일을 포함하고 있습니다. 따라서 JRE와 JVM을 모두 포함하고 있습니다.
포함 관계이긴 하지만 굳이 JDK와 JRE를 비교해본다면, JRE로는 이미 컴파일된 자바 바이트코드(.class)를 실행만 할 수 있고, JDK로는 직접 자바 코드(.java) 컴파일, 디버깅, 실행 등 개발단계에서 필요한 모든 기능을 수행할 수 있습니다. 대표적으로 JDK는 JRE에서 추가적으로 아래 라이브러리를 포함하고 있습니다.
- javac: 자바컴파일러
- jar: 라이브러리,리소스를 하나로 묶어주는 툴
- jdb: 디버깅툴
- appletviewer: 자바 애플릿 디버깅툴
- apt: 어노테이션 툴
- 외 다수 (javap, jdeps 등등)
추가적으로 자바 11부터는 JDK만 제공하고, JRE만 따로 설치하는 것을 제공하지 않습니다. 애초에 JDK내에 JRE가 포함되어있어서 문제가 생길일은 없지만, 오라클의 JDK 11 release 노트를 봐도 따로 이유는 설명된게 없고 그렇게 되었다고만 나오네요. 옵션을 줄여서 사용자들에게 더 간편하게 제공하도록 하려고 한것으로 추정됩니다.
출처:
- [JAVA] JVM 동작원리
- [Java] 자바 JDK, JRE의 차이점(JDK란? JRE란?)
- [Java] 자바 가상머신 JVM(Java Virtual Machine) 총정리
- [JAVA/자바] JVM, JRE, JDK 알아보기
'Java' 카테고리의 다른 글
[Java] JIT 컴파일러 (JIT Compiler) (0) | 2022.09.30 |
---|---|
[Java] JVM 동작 및 실행 과정 (0) | 2022.09.28 |
[Java] 자바(Java)의 역사 (0) | 2022.09.27 |
[Java] JSON 파싱하기 (jackson/gson/json-simple) (1) | 2021.10.16 |
[Java] HashSet 합집합 add(), addAll() 시 UnsupportedOperationException 날 경우 (0) | 2021.06.29 |