6. 기초_JVM

JVM(Java Virtual Machine)은

  • 자바 프로그램을 실행하기 위한 가상 머신이며, 자바 프로그램의 실행 환경을 제공합니다.

  • JVM이 설치된 환경에서는 동일한 바이트코드를 실행할 수 있어, 어떤 환경에서든지 자바 바이트코드를 실행할 수 있습니다. 이를 플랫폼 독립성이라고 합니다.

  • JVM은 자바 프로그램을 컴파일하여 바이트코드로 변환 후 이를 실행합니다.

JVM의 구성 요소

  • 클래스 로더 시스템 (Class Loader Subsystem)

  • 메모리 영역

  • 실행 엔진 (Execution Engine)

  • 네이티브 메소드 인터페이스 (Native Method Interface, JNI)

  • 네이티브 메소드 라이브러리 (Native Method Libraries)

클래스 로더 시스템

  • 자바 클래스 파일(.class)를 로드하고, JVM 내에서 사용할 수 있도록 준비

  • 로드된 클래스는 메소드 영역(Method Area)에 저장

  • 클래스 로딩의 세 가지 단계: 로딩, 링크, 초기화

메모리 영역

주요 메모리 영역은 다음과 같습니다.

  • 메소드 영역

    • 로드된 클래스, 메타데이터, 정적 변수, 상수 풀 등이 저장됩니다.

  • 힙 영역

    • 객체 인스턴스와 배열이 저장되는 곳입니다. 모든 스레드가 공유합니다.

  • 스택 영역

    • 각 스레드마다 개별적으로 존재하며, 메소드 호출 시 생성되는 프레임이 저장됩니다.

    • 로걸 변수, 메소드 호출 정보를 포함합니다.

  • PC 레지스터

    • 각 스레드마다 개별적으로 존재하며, 현재 실행 중인 JVM명령의 주소를 저장합니다.

  • 네이티브 메소드 스택

    • 네이티브 메소드 호출 시 사용되는 스택입니다.

실행 엔진

  • JVM 내에서 바이트코드를 실제 머신 코드로 변환하여 실행합니다.

주요 구성 요소는 다음과 같습니다.

  • 인터프리터: 바이트코드를 한 줄씩 읽어 해석하고 실행합니다. 실행 속도가 느리지만, 초기 로드가 빠릅니다.

  • JIT(Just-In-Time Compiler)

    • 반복되는 바이트코드를 머신 코드로 컴파일하여 캐시해 둡니다. 이로 인해 실행 속도가 빨라집니다.

  • 가비지 컬렉터

    • 사용하지 않는 객체를 자동으로 메모리에서 해제하여 메모리 누수를 방지합니다.

네이티브 메소드 인터페이스 (Native Method Interface, JNI)

  • 자바 코드가 C/C++ 등의 네이티브 코드를 호출할 수 있게 합니다.

  • 네이티브 메소드 라이브러리를 로드하고 관리합니다.

네이티브 메소드 라이브러리 (Native Method Libraries)

JNI를 통해 호출되는 네이티브 메소드의 실제 구현체를 포함하는 라이브러리입니다.

JVM의 주요 기능

  • 플랫폼 독립성

    • 자바 바이트코드는 운영 체제와 하드웨어에 독립적입니다.

    • JVM이 설치된 환경에서는 동일한 바이트코드를 실행할 수 있습니다.

  • 메모리 관리

    • JVM은 자동으로 메모리를 관리하며, 가비지 컬렉션을 통해 사용되지 않는 메모리를 해제합니다.

  • 보안

    • JVM은 자바 바이트코드를 검증하여 안전하게 실행되도록 합니다.

    • 클래스 로더는 클래스를 격리하여 로드하고, 보안 관리자(Security Manager)는 프로그램이 수행할 수 있는 작업을 제한합니다.

  • 성능 최적화

    • JIT 컴파일러와 다양한 최적화 기법을 사용하여 실행 성능을 높입니다.

JVM 동작 과정

  • 자바 소스 코드(.java 파일)가 자바 컴파일러(javac)에 의해 바이트코드(.class 파일)로 컴파일 됩니다.

  • JVM은 클래스 로더를 통해서 바이트코드(.class 파일)를 로드합니다.

  • 로드된 바이트코드는 메모리(Method Area, Heap)에 적재됩니다.

  • 실행 엔진은 인터프리터와 JIT 컴파일러를 통해 바이트코드를 실행합니다.

  • 프로그램 실행 중 필요에 따라 가비지 컬렉터가 메모리를 관리합니다.

컴파일이란?

  • 소스 코드를 기계어 또는 바이트코드로 변환하는 과정

  • Java에서는 이 과정을 통해 소스 코드를 JVM이 이해하고 실행할 수 있는 바이트코드로 변환

// 1. .java 파일
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

Last updated