[JAVA] JVM(자바 가상 머신)이란? (역할, 동작 과정, 구성 요소)

728x90

 

안녕하세요. 오늘은 자바의 JVM에 대해 포스팅하도록 하겠습니다.

JVM(Java Virtual Machine, 자바 가상 머신)이란?

자바 프로그램이 실행되기 위한 가상 환경으로, 자바 소스 코드(.java)를 컴파일하여 생성된 바이트코드(.class)를 실행합니다. 바이트코드는 특정 운영체제나 하드웨어(CPU)에 의존하지 않고(맞춰지지 않고!) 플랫폼 독립적이기 때문에 자바 프로그램은 JVM이 설치된 어떤 환경에서도 실행될 수 있습니다.

바이트코드는 기계어와 비슷한 형태이지만 직접 CPU에서 실행되는 기계어는 아니며, JVM이 바이트코드를 해석(interpret)하거나 JIT(Just-In-Time) 컴파일러를 통해 기계어로 변환하여 실행합니다.

 

 

 

JVM의 역할

  • 바이트코드 실행 - 자바 컴파일러가 생성한 바이트코드를 받아서 해석하거나 기계어로 변환하여 실행
    • ⭐ 바이트코드는 기계어와 비슷한 형태로 JVM이 이해하고 실행할 수 있는 명령어 집합이며 플랫폼 독립적입니다. 즉, 바이트코드는 특정 운영체제나 하드웨어에 맞춰진 것이 아니라 JVM이 설치된 어떤 환경에서도 실행될 수 있습니다.
  • 메모리 관리 - 자바 프로그램에서 사용되는 메모리를 관리하며 가비지 컬렉션(Garbage Collection) 기능을 통해 더 이상 사용되지 않는 객체를 자동으로 메모리에서 제거
  • 플랫폼 독립성 제공 - JVM이 설치된 환경에서 자바 프로그램이 동일하게 실행되도록 보장

 

 

 

JVM의 동작 과정

  1. 컴파일 - 자바 소스 코드는 자바 컴파일러에 의해 플랫폼 독립적인 바이트코드로 변환됨
  2. 클래스 로딩 - JVM은 필요한 클래스 파일을 Class Loader를 통해 메모리에 로드하고 링킹 및 초기화를 수행
  3. 바이트코드 실행 - 로드된 바이트코드는 JVM 내부의 Execution Engine에서 해석되거나 JIT 컴파일러를 통해 기계어로 변환된 후 실행됨
  4. 가비지 컬렉션 - 프로그램 실행 중 가비지 컬렉터가 힙 영역에서 사용되지 않는 객체를 자동으로 메모리에서 제거하여 메모리 누수를 방지함

 

 

 

JVM의 구성 요소

  • 클래스 로더(Class Loader) - 자바 클래스 파일(.class)을 메모리에 올리고 초기화하는 역할
    • 로딩(Loading) : .class 파일을 찾아서 메모리에 올림
    • 링킹(Linking) : 클래스 간 참조를 확인하고 메모리 주소를 연결
    • 초기화(Initialization) : 정적 변수와 static 블록을 초기화 및 실행
  • 실행 데이터 영역(Runtime Data Area) - 자바 프로그램 실행 시 필요한 메모리 구조
    • 메서드 영역(Method Area) : 클래스의 메타데이터(메서드 정보, 정적 변수 등)를 저장함. (모든 스레드가 공유)
    • 힙 영역(Heap Area) : 객체와 배열 저장. (모든 스레드가 공유하며 가비지 컬렉터가 관리)
    • 스택 영역(Stack Area) : 각 스레드의 지역 변수와 호출 정보 저장
    • PC 레지스터(PC Register) : 각 스레드가 현재 실행 중인 명령어 주소를 저장함
    • 네이티브 메서드 스택 : 자바 외의 네이티브 코드(ex. C, C++)를 실행 시 사용
  • 실행 엔진(Execution Engine) - 바이트코드를 기계어로 변환하고 실행하는 엔진
    • 인터프리터 (Interpreter) : 바이트 코드를 한 줄씩 읽어서 실행(빠른 시작, 느린 실행 속도)
    • JIT 컴파일러(Just-In-Time Compiler) : 자주 실행되는 바이트 코드를 기계어 변환(속도 최적화, but 처음 실행 시 오버헤드 발생 가능)
  • 가비지 컬렉터(Garbage Collector) - 힙 영역의 메모리 관리
    • 사용되지 않는 객체를 자동으로 탐지 및 제거(힙 영역에서 더 이상 참조되지 않는 객체를 탐지하여 메모리를 회수)
  • 네이티브 메서드 인터페이스(JNI, Java Native Interface) - 네이티브 코드와의 상호작용
    • 자바 프로그램이 네이티브 코드와 상호작용할 수 있도록 돕는 인터페이스
    • ex. 시스템 호출이나 외부 라이브러리와 통신할 때 사용됨

 

 

 

728x90