JVM(Java Virtual Machine)이란?
자바 가상 머신(Java Virtual Machine)은 자바 프로그램 실행환경을 만들어 주는 소프트웨어이다.
그렇다면 JVM이 왜 필요할까❓❓❓
JVM이 필요한 이유를 알기 위해서는 우선 Java라는 언어의 특징에 대해 알아보자.
즉, Java는 OS에 종속받지 않지 않기 때문에 OS에 종속받지 않고 실행되기 위해선 OS 위에서 Java를 실행시킬 무언가가 필요하고, 그 역할을 바로 JVM이 한다!!!
그렇다면 JVM을 사용함으로써 얻는 가장 큰 이점은 무엇일까? 바로 JVM을 사용하면 하나의 바이트 코드(.class)로 모든 플랫폼에 적용할 수 있다!!!
그렇다면 Java가 JVM을 통해서 컴파일되는 과정을 살펴보자.
따라서 OS에 종속적이지 않고, Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행 가능!!!
JVM은 크게 아래와 같이 이루어져 있다.
JVM 내로 .class파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.
쉽게 말해, 자바 프로그램을 작성하면 .java 파일이 만들어지고 이것을 행을 하게 되면 컴파일을 통해 .class(바이트코드)를 생성된다.
이때 Class Loader는 생성된 .class파일들을 Runtime Data Area에 적재하는 역할을 한다.
Runtime Data Area에 적재된 .class파일들을 기계어로 변경해 명령어 단위로 실행시키는 역할이다.
여기서 명령어를 실행하는 방법에는 interpreter, JIT 컴파일러 두가지 방법이 있다.
프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간이다.
.class파일이 적재되는 장소인 Runtime Data Area에는 다음 그림처럼 5가지 영역이 존재한다.
메서드 영역(= Class Area = Static Area)
→ 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
힙 영역
→ new 키워드로 생성되는 개체와 배열이 생성되는 영역
→ 메소드 영역에 적재된 클래스만 생성 가능하고, Garbage Collector를 통해 메모리 관리되는 영역
→ 힙 영역은 세 부분으로 구성됨
(1) Permanent Generation : 생성된 객체들의 정보의 주소값이 저장된 공간
(2) New/Young Generation : 생명 주기가 짧은 객체를 GC 대상으로 하는 영역
(3) Old Generation : 생명 주기가 긴 객체를 GC 대상으로 하는 영역
스택 영역
→ 지역 변수, 매개변수, 반환 값 등이 생성되는 영역이다.
→ 메소드 호출때마다 스택 영역이 생성된다.
PC Register
→ 스레드가 생성될 때마다 생성되는 영역으로 현재 실행되는 스레드이ㅡ 주소와 명령을 저장
Native Method Stack
→ 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
→ 즉, Java가 아닌 다른 언어로 작성된 코드를 위한 공간
JRE(Java Runtime Environment)이란?
자바 실행 환경(Java Runtime Environment)은 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리들과 각종 API, 그리고 JVM을 제공하는 소프트웨어 계층이다.
JDK(Java Development Kit)이란?
자바 개발 도구(Java Development Kit)은 Java 애플리케이션의 개발을 위한 툴 세트이다.
- 개발자는 Java EE(Java Enterprise Edition), Java SE(Java Special Edition) 또는 Java ME(Java Mobile Edition) 등 Java 버전 및 패키지나 에디션에 따라 JDK를 선택한다.
- Java 프로그램의 실행이 Java 프로그램 개발 프로세스의 일부이므로, 모든 JDK에는 항상 호환 가능한 JRE를 포함한다.
※ Java 프로그램을 직접 개발하려면 JDK 필요 / Java 프로그램을 실행하려면 JRE 필요 ※
다음으로 넘어가기 전에 하나의 의문점을 먼저 짚고 넘어가보자
Q : JDK 버전과 Java 버전이 같은 것인가?
우선 이 질문에 대해 답을 찾기 위해 엄청 해맸었다... 인터넷에 JDK 버전별 특징을 치면 대부분의 블로그에서 Java 버전별 특징을 알려주어서 같은 것인가... 하지만 아주 착한 우리 형들(진로, 헤롱) 덕분에 해소가 되었다. 질문에 대한 답은 다음과 같다.
A : 자바 버전은 언어 규격이고 그 규격을 구현한 것을 JDK이다.
하지만 JDK에는 javac라는 개발도구를 포함하고 있기 때문에 JDK17에선느 javac 버전도 Java17에 맞추어진다고 한다. 그래서 정확한 답은 두 가지가 다르다고 보는게 맞지만!! JDK 버전과 Java 버전을 같다고 봐도 무관할 것 같다...
[JAVA] JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...)
[Java] 자바 가상머신 JVM(Java Virtual Machine) 총정리
자바가상머신 JVM 이란?
https://www.java.com/releases/