Java를 공부하는 사람이라면 JVM을 들어본적이 있을텐데 개발 또는 현업에 몰두하고 있다면 제대로 알지 못하거나 잊어버리는 사람들이 많을 것이다. Java로 작성된 코드를 실행시키는 JVM과 JDK, JRE에 대해 간단하게 정리한다.
Java Virtual Machine은 자바코드로 작성된 프로그램이 CPU나 운영체제 등의 환경에 상관없이 독립적으로 동일하게 동작될 수 있게 만들어진 프로그램이다.
자바코드로 작성된 프로그램은 컴파일될 때, 컴파일러(javac)에 의해 바이너리 코드로 변환된 .class 파일로 변환되는 것을 볼 수 있는데 이 파일을 JVM으로 실행시키기 때문에 동일하게 동작될 수 있다.
때문에 JVM이 구동될 수 있는 환경이라면 모두 실행이 가능하기 때문에 높은 이식성을 보인다.
JVM은 Class Loader, Execution Engine, Runtime Data Area, Garbage Collector 4가지의 구성으로 나눌 수 있다.
정리부터 하자면 컴파일된 소스코드(.class)를 Class Loader를 통해 Runtime Data Area에 바이트코드들을 배치하고, Execution Engine을 통해 실행 시키며 이 과정에서 Garbage Collector가 자동으로 메모리를 관리해준다.
추상클래스인 Class Loader를 활용해서 각각의 디렉토리에 흩어져 있는 .class 파일들을 찾아 JVM의 메모리에 탑재해 준다(이 과정을 Loading 이라고 한다.) (기본적인 라이브러리의 클래스 파일들은 환경변수 $JAVAHOME_ 경로에서 찾아 탑재시켜준다.)
뿐만 아니라 검증(Linking), 초기화(Initialization) 기능도 포함하고 있다.
Class Loader는 JVM에 내장되어있는것이 아닌 'JRE'에 내장되어 있다.
Class Loader를 통해 JVM 내의 2-3의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행한다. JIT 컴파일러 방식을 사용해서 .class 파일의 바이너리 코드를 어셈블리어 같은 언어로 변환함으로써 빠른 실행을 가능하게 한다.
하지만 변환하는 과정도 비용이 발생하기 때문에 모든 코드들을 JIT 컴파일러 방식으로 실행하지 않고 인터프리터 방식으로 사용되며 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 두가지의 방시을 혼용하여 실행시킨다.
예를 들어, JIT 컴파일러는 실행할 때 여러번 실행되는 코드는 해석 후 캐싱한다.
이후 바뀐 부분만 컴파일 한 후, 나머지는 캐싱된 코드를 사용함으로써 인터프리터의 단점을 개선한다.
JVM의 메모리 영역으로 자바 프로그램을 실행할 때 사용되는 데이터들이 저장되는 영역이다.
이 영역은 크게 5가지의 영역으로 다시 나뉜다.
Method Area
Heap Area
Stack Area
PC Register
Native Method Stack
줄여서 GC라고도 부르며 Runtime Data Area의 Heap Area의 객체를 주기적으로 탐색하여 필요가 없어진 객체를 삭제한다. C언어와는 다르게 개발자는 Garbage Collector때문에 메모리누수에 크게 신경쓸 일이 없다.
JDK란 Java Development Kit의 약자로 자바 통합 개발 환경을 의미하고,
JRE는 Java Runtime Environment의 약자로 자바 실행 환경을 의미한다.
(개발시 실행해보는 것은 당연하므로) JRE는 JDK에 속해있고 JVM은 JRE에 속해있다.
(JDK > JRE > JVM)
자바 통합 개발 환경을 의미하는 만큼 Java를 사용하기 위해 모든 기능을 갖춘 SDK(Sofrware Development Kit). JRE와는 별도로 컴파일러(javac), 문서생성기(javadoc), 아카이버(jar)와 같은 도구도 갖추고 있으며 JDK를 설치하게 된다면, JRE를 별도로 설치할 필요가 없다.
개발목적에 따라 Java EE(Java Enterprise Edition), Java SE(Java Special Edition) 또는 Java ME(Java Mobile Edition) 등이 존재한다.
자바 실행 환경, 자바프로그램을 실행시키기만 한다면, JVM이 내장된 JRE만 설치하면 된다.
JVM과 JVM이 실행될 수 있는 필수 런타임 라이브러리와 패키지클래스(Util, Math 등), API 등이 포함되어 있다. 즉 JVM의 실행환경의 구현체라고 말할 수 있다.
(개발자가 아닌 사용자가 JRE를 설치하는 경우는 거의 없는데 자바로 개발된 프로그램을 배포 시 이 JRE와 함께 배포하기 때문이다.)