[JVM] JVM 이란
JVM이란
JVM은 Java Vertual Machine의 약자로 ‘자바를 실행하기 위한 가상 기계’를 말합니다.
JVM이 필요한 이유
JVM은 자바 애플리케이션을 운영체제와 상관없이 실행시킬 수 있도록 해주고
프로그램 메모리를 관리하고 최적화를 해줍니다.
(정확하게는 Java라는 언어가 JVM으로 인해서 OS에 독립적이라는 것으로,
JVM자체로는 OS마다 정의된 실행방법을 따르기 때문에 JVM 자체는 OS에 종속적입니다.)
추가로, 자바로 작성된 애플리케이션은 JVM을 통해 실행되기 때문에 반드시 JVM이 필요한데
위의 사진처럼 OS로 전달되기 전에 JVM을 거쳐 해석되고 실행되기 때문에 속도가 느리다는 단점이 있습니다.
하지만 최근에는 JIT 컴파일러의 성능 향상과 최적화 기술의 발달로 속도 저하가 많이 줄어서 큰 문제는 되지 않습니다.
결과적으로, JVM은 OS와 HW에 독립적이라는 특징 때문에 WORA가 실현을 가능하게 해 필요합니다.
WORA에 대해 참고한 블로그 글
JVM의 구조와 동작과정
JVM의 구조
JVM은 크게 Runtime Data Area, Garbage Collector, Execution Engine, Class Loader의 4가지 영역으로 나뉩니다.
- Runtime Data Area
JVM의 메모리 영역으로 응용프로그램이 실행되면 OS로부터 별도의 메모리 공간을 할당받고
JVM은 할당받은 메모리를 용도에 따라 여러 영역으로 나누어 관리하게 됩니다.
메모리 영역은 Method Area, Heap Area, Stack Area, PC register, Native Method Stack으로 나뉩니다.
Runtime Data Area에 대한 내용은 따로 정리한 글인 JVM의 메모리 구조에서 설명하겠습니다. - Garbage Collector
GC는 JVM 상에서 메모리 관리를 위해 더 이상 사용되지 않는 데이터가 할당되어 있는 메모리를 해제시켜주는 역할을 합니다.
GC가 메모리를 해제하는 대상은 Runtime Data Area의 Heap 영역의 객체 중에서 참조되지 않은 데이터인데,
JVM에서 자동으로 동작하기 때문에 특별한 경우가 아니면 메모리 관리를 개발자가 직접 하지 않기를 권장합니다.
GC만으로도 내용이 많기 때문에 따로 Java의 Garbage Collector에 정리되어있습니다. - Class Loader
Class Loader는 컴파일 과정을 거쳐 생성된 .class 파일들을
Class Loader가 운영체제에 의해 메모리를 할당받은 Runtime Data Area로 적재하는 역할을 합니다.
자세한 내용은 Java의 Class Loader에 정리되어 있습니다. - Execution Engine
Class Loader에 의해 Runtime Data Area로 적재된 .class 파일들을 하나의 명령 단위로 읽어서 컴퓨터가 이해할 수 있는 기계어로 번역하고 명령을 실행합니다.
Interpreter 방식과 JIT(Just-In-Time) 방식이 존재합니다.
Interpreter와 JIT에 대한 내용도 여기에 정리하겠습니다.
JVM의 동작 과정
위 사진처럼 우리가 작성한 자바 코드는 *.java라는 확장자로 컴퓨터에 저장이 됩니다.
그리고 *.java는 JVM이 인식할 수 있는 Java Bytecode(*.class)로 변환됩니다.
이 과정을 컴파일 과정이라 하며 여기서 Java Compiler가 동작합니다.
(💡 Java Compiler는 JDK에 포함되어 있는 javac.exe를 말합니다. bin 폴더에 가보면 확인이 가능합니다.)
윈도우의 명령 프롬프트(cmd)를 이용해 컴파일할 수 있습니다.
*.java 파일이 저장된 위치로 이동 후
이렇게 입력해 주면 컴파일이 되어 (*.class) 파일이 생성됩니다.
*.class는 CPU가 읽고 동작하지 못하므로 기계어로 바꿔줘야 합니다.
JVM이 OS에 맞춰 CPU가 java bytecode를 이해할 수 있도록 해석하고 그다음 실행됩니다.
(이 과정에서 앞서 언급했던 Runtime Data Area, Garbage Collector, Execution Engine, Class Loader도 작동합니다.)
결과적으로 우리는 JVM이 있는 환경에서 java 파일만 만든다면 OS와 상관없이 실행이 가능하게 됩니다.
JVM, JRE, JDK의 차이
JVM을 공부하면 당연히 따라오는 것이 JDK와 JRE입니다.
JVM은 위에서 설명했으므로 JRE와 JDK가 무엇을 의미하는지 알아보도록 합시다.
JRE
JRE는 자바 런타임 환경 💬(Java Runtime environment)이라는 의미이다.
(런타임 환경: 어떠한 소프트웨어를 실행시키기 위한 또 다른 소프트웨어)
따라서, JRE는 Java가 동작하는데 필요한 다양한 구성요소를 포함하고 있습니다.
JRE의 구조
JRE는 크게 Class Libraries, Class Loader, Java Vertual Machine으로 이루어져 있습니다.
- Class Loader
Class Loader는 사실 엄밀히 말하자면 JVM에 속하지 않습니다.
JVM과 밀접한 관련이 있어서 JVM을 설명할 때 필수적으로 언급되지만 정확하게는 JRE에 속해 있습니다.
위에서 언급한 내용이므로 자세한 설명은 적지 않겠습니다. - Class Libraries
JRE는 애플리케이션과 서비스 간에 완벽한 데이터 연결을 구축할 수 있도록 지원하는 다수의 통합 라이브러리를 제공하는데, Class Libraries에 포함되어 있습니다. - JVM
위에서 설명한 JVM은 JRE에 포함되어 있습니다.
JDK
JDK는 Java Development의 약자로 자바 개발 키트를 의미합니다.
JRE와 javac 등의 컴파일러, 디버거 등을 포함하는 프로그램을 말합니다.
JDK 포함관계 도식도
JDK 구성
- apt : 어노테이션 툴
- appletviewer : 다른 개발 툴 없이도 자바 애플릿을 실행시키고 디버깅할 수 있는 툴
- jdb : 자바 디버깅 툴
- javac : 자바 컴파일러
이 외에도 여러 가지 개발 툴이 더 존재합니다.
JDK 종류
- Java SE (Java Platform Standard Edition)
표준 자바 플랫폼, 표준적인 컴퓨팅 환경을 제공하기 위한 가상머신 규격 및 API집합을 포함
자바라는 언어가 어떤 문법적 구성을 가졌는지와 같은 것들을 정의
구체적인 소프트웨어가 아니고 그 소프트웨어의 설계도 - Java EE (Java Platform Enterprise Edition)
Java SE에 웹 애플리케이션 서버에서 동작하는 기능을 추가한 플랫폼 - Java ME (Java Platform Micro Edition)
조금 더 제한된 자원을 가진 휴대전화, PDA 등에서 Java 프로그래밍 언어를 지원하기 위해 만들어진 플랫폼
결론
- JDK는 개발을 하기 위한 툴을 제공해 줍니다.
- JRE가 설치되어 있다면 어느 환경에서든 Java코드를 실행할 수 있습니다.