JVM과 JDK, JRE의 차이

JVM과 JDK, JRE의 차이에 대해 간단히 알아봅니다.


JVM이란

JVM이 있는 자바는 C 같은 컴파일 언어의 컴파일러와 어떤 차이가 있는가

컴파일 언어는 똑같은 언어로 짜서 컴파일한 기계어라도 , OS 별로 컴파일을 해야 한다.

윈도우에서 돌게끔 컴파일해도 맥이나 리눅스에서는 돌지 않는 경우가 발생 (그래서 C, GO 같은 컴파일 언어는 각 환경에 맞게끔 크로스 컴파일을 해야 함)

Java에는 이런 경우를 대비하기 위한 JVM이 존재. OS 위에서 통역가 같은 역할. (따라서 자바 컴파일 시 기계어 아닌 바이트 코드로 변환하는데, 이는 자바 코드 - 기계어 의 중간 쯤에 존재하는 코드)

개발 후 컴파일을 위해 javac mainapplication.java 명령어를 입력하면 같은 위치에 mainapplication.class 가 떨어지는데 이게 바이트 코드이다.

이 .class 를 실행할 환경의 JVM에 가져다 주면 환경에 맞는 기계어로 그떄그때 통역을 해줌.

이 바이트코드를 쓰는 점에서 나오는 장점은 Groovy, Scala, Kotlin, Clojure 도 JVM 전용 바이트코드로 컴파일이 되므로 그 언어들로도 JVM 환경이라면 Java를 대체해서 코딩 가능. (이론상 모두 호환이 가능하다 스프링이든 안드로이드든)

이 JVM 처럼 실행시점에 기계어로 통번역을 하는 방식을 JIT(Just in time , 주로 사용하는 용어임) 컴파일이라고 함. (JIT 컴파일은 파이썬에서도 성능을 매우매우매우매우 높여주므로 꼭 알고 있도록 하자)

즉, JVM는 자바로(또는 호환되는 언어) 짠 코드를 컴파일 한 소프트웨어들이 어떤 종류의 컴퓨터에서도 돌 수 있게 해주는 것이며, 한 번 작성하면 어디서든 실행할 수 있다는 게 자바의 특징이다.

JRE란

Java Runtime Environment

Runtime 은 Compile과 대조되는 말.

코딩 후 배포하기 전 미리 바이트 코드나 기계어로 번역 작업해두는 걸 컴파일이라 하는데 , 런타임은 반대로 이걸 실행하는 시점을 말함.

JRE는 컴파일된 자바 소프트웨어가 실행될 때 환경 요소로 필요한 것임.

우리가 리스트나, 맵 같은 자료구조를 사용할 수 있는 이유도 JRE에 포함된 rt.jar이 존재하기 때문임 (실제로 까보면 자바 라이브러리들이 구현돼있는 바이트 코드가 존재함.)

가끔 프로그램을 설치할 때 자바가 필요하다며 자바를 같이 다운로드하려고 할 때 설치되는게 JRE임. JRE만 깔리면 자바로 작성한 소프트웨어를 실행할 수 있음. (JRE는 JVM도 포함하고 있기에)

즉, JRE란 클래스를 로드해서 연결하기 위한 클래스 로더, 자료구조 등을 사용할 수 있게 해주는 클래스 라이브러리, 가상 머신인 JVM을 포함하며 메모리 관리 등을 해준다고 보면된다.

JDK란

Java Development Kit

JDK는 JRE와 JVM 을 모두 가지고 있고 추가로 개발에 필요한 것들 , 컴파일 시 사용하는 javac나 디버깅할 때 쓰는 jdb , 패키징 도구인 jar도 포함함.

즉, 최종 사용자 (돌리기 위한 환경)이 아닌 프로그래머를 위한 기능도 탑재하고 있는 것임.

JRE 11 이상 버전이 없는 이유, JDK 버전이 다양한 이유

JRE는 11이상부터 버전이 없다.

그러면 돌리기 위한 환경에서는 JDK를 다운받아야 하는 건가 싶지만 자바 11부터는 JRE를 설치하지 않고도 돌아갈 수 있게 자바 프로그램에 JRE와 JVM 요소들까지 끼워넣은 것이다.

자바 돌리는 서버같은 경우는 어차피 용량 크지 않으니까 아예 JDK를 설치해서 쓰게 하는 것임.

JDK 버전같은 경우는 공짜도 있고 돈내야 쓸수있는 것도 있고 등등 종류가 매우 다양함.

OracleJDK는 상업적 이용에 한해 유료임. 무료로 쓰려면 OpenJDK나 다른 곳에서 만든 걸 사용해야 함. (ms openjdk라는 것도 있음)

JDK 버전에 따라서 내장된 JVM도 다른데, 유료는 안정성, 최신 기능이 잘 탑재가 됨. 하지만 무료도 매우 딸리는건아님.

배포 환경에서 어떤 것을 선택해야 할지?

당연히 권장되는 버전은 JDK나 JRE 경량 버전이 아닌 기본 버전

경량 버전을 사용하여 개발과 배포 버전을 다르게 사용하는 것은 좋은 방법은 아니지만 일반버전을 도커에서 사용하게 되면 용량이 너무 커지기 때문에 경량화 버전을 주로 사용하게 된다.

경랑화 버전은 자바를 실행하기 위한 최소한의 패키지만을 포함하고 있고 UI와 관련된 자바 라이브러리들은 포함하지 않는다.

구현해야 한다면 가장 작은 이미지를 베이스로 삼고 필요한 라이브러리들만 추가한 커스텀 이미지를 생성할 수도 있다.

마지막으로 JRE만 있어도 충분하기에 꼭 필요하지 않다면 JDK보단 JRE 버전으로 사용하는 게 이득이다.

Leave a comment