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