JVM (Java Virture Machine)

썩은요플렛's avatar
Aug 22, 2024
JVM (Java Virture Machine)
 
Java Virtual Machine(JVM)은 자바 프로그램이 어느 플랫폼에서나 실행될 수 있게 해주는 중요한 구성 요소이다. JVM은 자바 프로그램을 운영체제 및 하드웨어로부터 독립시켜주어 "한 번 작성하면 어디서나 실행 가능"이라는 자바의 특징을 구현한다.
 

1. JVM의 역할

JVM의 주요 역할은 다음과 같다:
  • 바이트코드 실행: 자바 프로그램은 바이트코드라는 중간 형태로 컴파일 된다. 이 바이트코드는 특정 운영체제나 하드웨어에 의존하지 않는 형태로, JVM이 이를 해석하여 실행한다.
  • 메모리 관리: JVM은 자동으로 메모리를 관리한다. 메모리는 힙(Heap)과 스택(Stack) 등으로 나뉘며, 객체의 동적 할당, 메소드 실행, 지역 변수 저장 등을 담당한다.
  • 보안: JVM은 프로그램이 시스템 리소스를 직접 접근하지 못하게 하여 안전한 실행 환경을 제공한다. 이는 프로그램이 허가되지 않은 작업을 수행하는 것을 방지한다.
  • 클래스 로딩과 링크: JVM은 프로그램 실행 중에 필요한 클래스를 동적으로 로딩하며, 클래스 간의 참조를 해소하여 올바르게 실행될 수 있도록 링크 작업을 수행한다.
  • 예외 처리: 자바 프로그램 내에서 발생하는 예외와 오류를 처리한다.
 

2. JVM의 구성 요소

JVM은 여러 가지 중요한 구성 요소로 이루어져 있다:
  • 클래스 로더 서브시스템: 자바 클래스 파일을 메모리에 로드하는 역할을 합니다. JVM 내의 클래스 로더는 계층적으로 구성되어 있으며, 부모 클래스 로더가 먼저 클래스를 로드하려고 시도한 후 실패하면 자식 클래스 로더가 이를 처리한다.
  • 런타임 데이터 영역: JVM 실행 중 사용되는 메모리 구조를 의미한다.
    • 메소드 영역: 클래스에 대한 정보, 메소드, 상수 풀 등이 저장된다.
    • 힙 영역: 동적으로 생성된 객체가 저장되는 영역이다.
    • 스택 영역: 각 스레드마다 독립적으로 존재하며, 메소드 호출 시 생성되는 프레임을 저장한다.
    • PC(프로그램 카운터) 레지스터: 현재 실행 중인 JVM 명령의 주소를 저장한다.
    • 네이티브 메소드 스택: 자바가 아닌 네이티브 메소드(C, C++ 등)의 호출에 사용된다.
  • 실행 엔진: JVM에서 바이트코드를 실제로 실행하는 핵심 부분이다.
    • 인터프리터: 바이트코드를 한 줄씩 해석하여 실행한다. 하지만 속도가 느릴 수 있다.
    • JIT(Just-In-Time) 컴파일러: 바이트코드를 네이티브 코드로 변환하여 실행 속도를 높인다. 주로 자주 실행되는 코드에 대해 최적화를 수행한다.
    • 가비지 컬렉터: 사용되지 않는 객체를 자동으로 메모리에서 제거하는 역할을 한다.
  • JNI (Java Native Interface): 자바 코드가 네이티브 코드(C, C++ 등)와 상호작용할 수 있도록 해준다.
  • 네이티브 메소드 라이브러리: JVM이 실행 중에 네이티브 메소드를 호출할 수 있게 도와주는 라이브러리이다.
 
JVM은 자바 및 기타 JVM 언어들이 어느 플랫폼에서나 실행될 수 있도록 해주는 강력한 가상 머신이다.
JVM의 내부 구조와 동작 원리를 이해하면 자바 애플리케이션의 성능을 최적화하고, 더 나아가 JVM의 전체적인 기능을 효과적으로 활용할 수 있다.
Share article

RottenYogurt's Development Blog