[Java] - JVM

Java

대학교에서 처음 Java를 공부할 때 들었던 이야기는 WORA(Write Once Run Anywhere)라는 내용이다.
솔직히 요즘 세상에 어떤 언어로 작성하던 어디서든 돌릴 수 있다고 생각했다.

이 부분을 대해서 자세히 알기 위해서는 Compile, Interpreted를 알아야한다.

Compile

우리가 흔히 컴파일 타임이라고 부르는 이 용어는 프로그래밍 언어로 코드를 작성한 뒤, 실행하기 전에 미리 컴퓨터가 읽을 수 있는 언어로 번역 작업을 해두는 것을 의미한다.

public class Post {

    private String title, content;

    public Post() {

    }

}

위와 같이 간단한 코드가 컴파일 되면 아래와 같은 바이트 코드로 변환된다.

// class version 61.0 (61)
// access flags 0x21
public class ka/Post {

  // compiled from: Post.java

  // access flags 0x2
  private Ljava/lang/String; title

  // access flags 0x2
  private Ljava/lang/String; content

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 10 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lka/chapter3/item10/consistency/Post; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1
}

실제로 우리가 어플리케이션을 실행할 때는 이 바이트 코드를 토대로 실행하게 된다.

즉, 컴파일 과정을 통해 우리가 작성한 코드의 어떤 문제가 있는지 확인할 수 있고, 컴퓨터가 읽을 수 있는 언어로 작성했기 때문에 실행 속도도 빠른 것이다!

Interpreted

Interpreted는 컴파일과 다르게 작성한 코드를 그대로 갖고 있다가 실행을 시킬 때, 실시간으로 읽어주면서 일을 시키는 언어이다.

개발에는 더 간편할 수 있지만, 오류에 취약하고, 실행이 느리다는 단점이 있다.

JVM(Java Virtual Machine)

위에서 본 것과 같이 컴퓨터 OS 종류마다 쓰는 기계 언어가 다 다르다.
Window 환경에서 C언어로 작성된 바이트 코드는 Mac, Linux 환경에서 돌리지 못한다.

Mac, Linux는 모두 UNIX 기반의 운영체제이다.
때문에 대부분 호환이 가능하지만, 운영 체제와 맞지 않는 라이브러리를 사용할 경우 호환되지 않을 수 있다.

하지만 Java는 C와 같은 언어와 달리 JVM을 통해 어디서든 실행할 수 있다.

우리가 프로그램을 설치할 때, 운영 체제에 맞는 프로그램을 설치하는 것처럼 Java 또한 운영 체제에 맞게 설치를 한다.
때문에 JVM은 현재 운영체제에 맞는 기계 언어와 자바 바이트 코드 언어를 할 수 있어 WORA가 가능해진 것이다.

Runtime

그러면 컴파일 된 바이트 코드는 어떤 과정을 통해 실행이 될까?

image
  1. JVM이 OS로부터 애플리케이션이 실행을 위해 필요로하는 메모리를 할당 받음
  2. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리함
  3. 컴파일러가 우리가 작성한 자바 파일을 읽어 클래스 파일(바이트코드)로 변환함
  4. 변경된 클래스 파일(바이트 코드)들을 클래스 로더를 통해 JVM 메모리 영역으로 로딩함
  5. 로딩된 클래스 파일(바이트 코드)들은 Execution Engine을 통해 해석함
  6. 해석된 네이티브 코드를 메모리 영역에 배치하고, 코드를 수행함

JIT Compiler

JIT이란, Just In Time의 약자로 프로그램을 실제 실행하는 시점에 번역하는 컴파일 기법이다.

앞서 설명한 과정과 같이 클래스 로더를 통해 JVM 메모리 영역으로 로딩하게 된다.
이후, 실제 메모리 영역에 배치하기 전 네이티브 코드로 번역해 컴퓨터가 읽을 수 있도록 하는 것이다.

image

JRE(Java Runtime Environment)

JRE는 자바 실행 환경의 약자이다. JVM이 애플리케이션 실행과 관련이 있으므로, JRE 내부에 속해있다.
이 외에도 우리가 흔히 사용하는 util이나 math 등과 같은 표준 라이브러리를 포함하고 있다.

java.util.*;
java.math.*;

JDK(Java Development Kit)

JDK는 자바 개발 키트의 약자이다. 우리가 자바 언어를 개발할 수 있는 이유가 JDK 덕분이다.

JDK는 개발을 할 수 있어야하고, 실행까지 해야할 수 있어야하기 때문에 아래와 같은 요소들이 포함되어 있다.

  • Compiler : 우리가 작성한 자바 코드를 바이트 코드로 변환해줌
  • JRE : 표준 라이브러리와 JVM을 통해 코드를 실행할 수 있도록 해줌
  • Debuger : 코드 실행 흐름을 하나하나 확인할 수 있게 도와줌
  • JAR : 실행할 수 있도록 압축해줌

이러한 요소들을 활용해 우리가 자바 프로그램을 개발, 테스트, 실행까지 할 수 있게 되는 것이다.

Reference

'Java > 이론' 카테고리의 다른 글

[Java] - 함수형 인터페이스  (1) 2023.09.25