자바 정복 일기 - JVM, JRE, JDK

Bex·2023년 8월 12일
0

1. 자바 가상 머신(JVM)

JVM(Java Virtual Machine)이란?

자바 가상 머신(Java Virtual Machine)자바 프로그램 실행환경을 만들어 주는 소프트웨어이다.

그렇다면 JVM이 왜 필요할까❓❓❓

1) JVM이 필요한 이유

JVM이 필요한 이유를 알기 위해서는 우선 Java라는 언어의 특징에 대해 알아보자.

"Java는 어떠한 플랫폼에 영향을 받지 않는다."

즉, Java는 OS에 종속받지 않지 않기 때문에 OS에 종속받지 않고 실행되기 위해선 OS 위에서 Java를 실행시킬 무언가가 필요하고, 그 역할을 바로 JVM이 한다!!!

그렇다면 JVM을 사용함으로써 얻는 가장 큰 이점은 무엇일까? 바로 JVM을 사용하면 하나의 바이트 코드(.class)로 모든 플랫폼에 적용할 수 있다!!!

그렇다면 Java가 JVM을 통해서 컴파일되는 과정을 살펴보자.

1단계 : Java compiler에서 .java파일 → .class파일 변환

  Java 소스코드, 즉 원시코드( * .java)는 CPU가 인식을 못하므로 기계어로 컴파일 해주어야 한다.
 하지만 Java는 JVM이라는 가상머신을 거쳐서 OS에 도달하기 때문에 OS가 인식할 수 잇는 기계어로
 바로 컴파일 되는 것이 아닌 JVM이 인식할 수 있는 Java bytecode(* .class)로 변환한다.

2단계 : JVM을 통해 ByteCode를 OS에서 실행

  1단계에서 변환한 ByteCode는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는다. 이 때, JVM이
 OS가 bytecode를 이해할 수 있도록 해석해준다. 따라서 ByteCode는 JVM 위에서 OS 상관없이 실행
 할 수 있다.

따라서 OS에 종속적이지 않고, Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행 가능!!!

2) JVM의 구성

JVM은 크게 아래와 같이 이루어져 있다.

  • 클래스 로더(Class Loader)
  • 실행 엔진(Execution Engine)
    • 인터프리터(Interpreter)
    • JIT 컴파일러(Just-In-Time)
    • 가비지 콜렉터(Garbage Collector)
  • 런타임 데이터 영역(Runtime Data Area)

(1) Class Loader

JVM 내로 .class파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.

쉽게 말해, 자바 프로그램을 작성하면 .java 파일이 만들어지고 이것을 행을 하게 되면 컴파일을 통해 .class(바이트코드)를 생성된다.
이때 Class Loader생성된 .class파일들을 Runtime Data Area에 적재하는 역할을 한다.

(2) Execution Engine

Runtime Data Area에 적재된 .class파일들을 기계어로 변경해 명령어 단위로 실행시키는 역할이다.

여기서 명령어를 실행하는 방법에는 interpreter, JIT 컴파일러 두가지 방법이 있다.

  1. Interpreter(인터프리터) : 명령어를 하나하나 실행하는 방법
  2. JIT 컴파일러 : 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 더 이상 인터프리팅하지 않고 기계어로 직접 실행하는 방식
  3. Garbage Collector(가비지 콜렉터) : 힙 영역에 생성된 객체 중에서 더이상 사용되지 않는 객체들을 탐색 후 제거하는 역할을 함

(3) Runtime Data Area

프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간이다.

.class파일이 적재되는 장소인 Runtime Data Area에는 다음 그림처럼 5가지 영역이 존재한다.

  1. 메서드 영역(= Class Area = Static Area)
    → 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간

  2. 힙 영역
    → new 키워드로 생성되는 개체와 배열이 생성되는 영역
    → 메소드 영역에 적재된 클래스만 생성 가능하고, Garbage Collector를 통해 메모리 관리되는 영역
    → 힙 영역은 세 부분으로 구성됨
    (1) Permanent Generation : 생성된 객체들의 정보의 주소값이 저장된 공간
    (2) New/Young Generation : 생명 주기가 짧은 객체를 GC 대상으로 하는 영역
    (3) Old Generation : 생명 주기가 긴 객체를 GC 대상으로 하는 영역

  3. 스택 영역
    → 지역 변수, 매개변수, 반환 값 등이 생성되는 영역이다.
    → 메소드 호출때마다 스택 영역이 생성된다.

  4. PC Register
    → 스레드가 생성될 때마다 생성되는 영역으로 현재 실행되는 스레드이ㅡ 주소와 명령을 저장

  5. Native Method Stack
    → 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
    → 즉, Java가 아닌 다른 언어로 작성된 코드를 위한 공간

2. 자바 실행 환경(JRE)/자바 개발 도구(JDK)

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/

profile
초보 개발자의 코딩 일기

0개의 댓글