JVM부터 JDK까지
개요
Java개발을 처음 시작하는 분들이 항상 헷갈리는 부분이 있습니다.
JVM, JIT, JNI, JRE, JDK...
J로 시작하는 3글자 단어들이 왜 이렇게 많은지.
오늘은 J로 시작하는 3글자 단어들 중 JVM, JIT, JRE, JDK에 대해 간단하게 알아보겠습니다.
JVM(Java Virtual Machine)
JVM은 Java를 실행하기 위한 가상 환경입니다.
JAVA이전의 세상을 잠깐 보겠습니다.
어셈블리, C와 같은 로우 레벨 언어들이 세상을 지배하던 시절에는 개발환경이 정말 큰 변수였습니다.
세상에 나오는 수많은 HW들이 사용하는 명령어 집합이 모두 다르고, OS마다 라이브러리가 다르고...
HW를 하나 바꿀 때마다 코드 수정을 하고, OS를 바꿀 떄마다 수정을 하고, 다시 만들고...
하나의 프로그램을 개발하기 위해 수많은 개발자들이 고생했습니다.
또, 이러한 로우레벨 언어들은 메모리를 직접 건드리기 때문에 난이도가 높을 뿐더러 보안 문제가 발생할 여지도 있었습니다.
이렇게 환경 종속성을 낮추고 이식성을 높여 생산성을 극대화하기 위해 나온 개념이 바로 JVM입니다.
JVM을 통해 바이너리 파일(.class)을 기계어로 컴파일하고 실행할 수 있습니다.
다만, JVM은 OS종속적이기 때문에 OS에 알맞은 JVM을 설치해야 합니다.
.java파일은 크게 신경을 쓰지 않고 작성하되, JVM만 OS에 알맞은 것을 설치하는 방식입니다.
기존 로우레벨 언어의 컴파일 방식과 자바의 컴파일 방식을 비교하면 아래와 같습니다.
C, C++과 같은 로우레벨 언어의 경우, 아래와 같은 과정을 거칩니다.
Source Code - Machine Code - Process
소스 코드에서 바로 기계어로 컴파일, 실행하기 때문에 처리속도가 매우 빠릅니다.
다만, 생성된 코드가 빌드 환경 종속적입니다.
Java에서는 한 단계가 더 추가되었습니다.
Source Code - Compiler - Byte Code(.class) - JIT - Machine Code - Process
Java Compiler(javac)가 소스코드(.java)를 바이트코드(.class)로 컴파일하고, JIT가 바이트코드를 다시 기계어로 컴파일한 뒤 실행합니다.
초기 자바는 인터프리터를 이용해 바이트코드를 기계어로 한 줄 한 줄 실행했습니다.
따라서 규모가 커질수록 속도가 매우 느려질 수밖에 없었고, 이 때문에 JIT가 등장했습니다.
JIT(Just In Time)
JIT컴파일러의 등장은 Java실행속도를 빠르게 하는 데 공헌했습니다.
HotSpot VM은 99년에 출시되어 지금까지 많이 사용되는 대표적인 JVM입니다.
그리고 HotSpot VM은 2개의 JIT 컴파일러를 가지고 있습니다.
C1 : Client Compiler
Client Compiler의 경우 처음 실행시간을 단축하는 데 최적화된 컴파일러입니다.
사용자가 무언가 실행하기를 원하면 그 작업을 빠르게 실행하는 데 최적화되었습니다.
C2 : Server Compiler
Server Compiler는 첫 실행시간보다 지속 실행될 때 최적화에 중점을 둔 컴파일러입니다.
처음 로드할 때는 느리지만 지속적으로 실행할 때 장점이 극대화됩니다.
HotSpot VM은 작업 첫 실행 시 C1을 사용하고, 이후 반복되는 구간이 생기면 C2로 전환시킵니다.
컴파일을 계층적으로 진행하는 방식입니다.
JRE(Java Runtime Environment)
JVM이 실행되면 수많은 클래스, 라이브러리 등이 로딩되어야 합니다.
JVM자체만으로 많은 것들을 포함하고 있기 때문입니다.
대표적으로 class loader, JIT compiler, GC등이 있습니다.
이런 친구들이 아무것도 없이 갑자기 적재되고 실행되지는 않을 것입니다.
따라서 해당 기능들을 가져올 라이브러리 등이 필요하고, JRE는 이런 자원을 포함하고 있습니다.
다시 말해, JRE는 JVM + JVM 실행을 위해 필요한 자원을 가지고 있습니다.
JDK(Java Development Kit)
마지막 의문을 해결할 차례입니다.
Java파일이 기계어가 되는 과정을 잠깐 이야기할 때, javac라는 단어를 언급했습니다.
JRE는 JVM과 JVM동작에 필요한 자원을 제공하지만, 우리가 java개발을 하기 위해 필요한 것을 제공하지는 않습니다.
JDK는 우리가 java개발을 하기 위해 필요한 자원을 제공하는 일종의 SDK(Software Development Kit)입니다.
java개발을 하고 그 파일을 실행하기 위해서는 JRE가 당연히 필요할 것이고, 우리가 만들 .java를 바이트코드로 만들 자원이 필요합니다.
JDK는 javac(java compiler), java와 같은 자원을 제공합니다.
정리
JVM, JIT, JRE, JDK를 그림으로 표현하면, 이렇게 정리할 수 있을 것입니다.
***수정, 문의, 기타사항은 댓글로 적어주세요.