Java Virtual Machine, JVM 이란?

자바 응용 프로그램을 실행시키기 위한 가상 머신으로 자바를 실행시키기 위한 프로그램

일반적으로 다른 프로그래밍 언어의 경우,

컴파일러를 통해 컴파일할 때, 특정 시스템에 종속적인 결과물이 나오게 되어 있다

반면, Java 컴파일러는 JVM, Java Virtual Machine 에 대한 결과물을 생성한다.

이를 통해, 다른 플랫폼이나 환경이 다를 지라도 JVM만 있다면 동일한 결과물을 얻을 수 있게 되었다.

좀 더 자세히 살펴보자면

Java 컴파일러는 .java 파일을 .class 파일로 컴파일을 하게 되는데

.class 파일이 JVM에 입력되어 로드되고 실행되게 된다.

JVM의 구조

structure.png

위 구조도를 참고하여 보자면

JVM은 크게 세가지 영역으로 이루어져 있다.

  1. 클래스 로더
    ClassLoader Subsystem
  2. 런타임 데이터 영역
    Runtime Data Area
  3. 실행 엔진
    Execution Engine

각각 영역에 대한 자세한 내용은 차차 다루도록 하고

무슨 역할을 하는지 간략하게 알아보자

클래스 로더

자바의 경우 동적으로 클래스를 읽어온다.
Dynamic Class Loading 동적 클래스 로딩

런타임 상에 모든 코드가 JVM 상에 링크된다는 것인데, 좀 더 풀어서 설명하자면

앞서 설명처럼

자바 프로그램이 실행될 때, 컴파일된 class 파일로 입력되고 실행

해당 역할을 담당하는 시스템 모듈이다.

런타임 데이터 영역

흔히 말하길 메모리 영역이라고도 불리는 영역이다.

JVM 상에서 사용되는 데이터들을 적재하는 영역

메소드, 힙, 스택, PC Register, 네이티브 메소드 스택(JNI) 등이 있다.

실행 엔진

런타임 데이터 영역에 할당된 바이트코드를 실행시킨다.

실행 엔진은 바이트 코드를 읽어 명령어 단위로 실행시킨다.

명령어 실행은 두 방식으로 나뉘어 실행되는데

  1. 인터프리터
  2. JIT 컴파일러

이 두가지 방식으로 실행된다.

추가적으로 실행엔진에서 GC라고 흔히 부르는

Garbage Collector가 동작하여 불필요한 리소스를 반환한다.

JRE? JDK?

JVM 구현체를 포함한 녀석들이다.

흔히 말하는 자바 다운로드, 자바 개발 환경 설정을 할때, 나오는 녀석들

  • JRE
    • Java Runtime Environment 자바 실행 환경의 약자
    • JVM + Library
    • 실행 관련 핵심 부분을 포함하고 있다
    • 개발 관련 도구 ❌
  • JDK
    • Java Development Kit 자바 개발도구의 약자
    • JRE + 개발 관련 도구

자바 코드 실행 흐름

  1. 프로그램 실행
  2. JVMOS로부터 메모리 할당
    이 때 JVM이 할당 받은 메모리를 여러 영역으로 나누어 관리
  3. 자바 컴파일러가 class 파일로 컴파일
  4. 클래스 로더를 통해 JVM으로 로딩
  5. 로딩된 class 파일은 실행 엔진을 통해 해석 및 실행

참조