JVM다시 정리하기

박화랑·2025년 3월 16일
0

Spring_6기

목록 보기
13/15

JVM(Java Virtual Machine)이란?

JVM은 자바 애플리케이션을 실행하기 위한 가상 머신이다.
자바는 운영체제(OS)에 직접 종속되지 않고, 한 번 작성된 코드가 다양한 환경에서 실행될 수 있도록 설계되었다.
이것이 바로 "Write Once, Run Anywhere" 개념이며, 이를 가능하게 하는 것이 바로 JVM이다.

자바 프로그램은 일반적인 프로그램과 실행 방식이 다르다.
일반적인 프로그램은 운영체제에서 직접 실행되는 기계어로 변환되지만,
자바 프로그램은 JVM 위에서 동작하는 바이트코드(.class 파일) 형태로 실행된다.
JVM이 이 바이트코드를 해석(interpret)하거나 컴파일(compile)하여 실행하는 방식이다.


JVM을 사용하는 이유

JVM을 사용하는 가장 큰 이유는 플랫폼 독립성 때문이다.
자바로 작성된 프로그램은 Windows, macOS, Linux 등 어떤 운영체제에서도 실행될 수 있다.
이는 JVM이 각 운영체제에 맞는 인터프리터 역할을 수행하기 때문이다.

또한 JVM은 단순한 실행 환경이 아니라 메모리 관리, GC(Garbage Collection), 실행 최적화(JIT Compilation) 등 다양한 기능을 제공한다.
이 덕분에 자바는 성능과 안정성이 뛰어난 프로그램을 개발할 수 있도록 지원한다.


JVM의 구조

JVM은 크게 클래스 로더(Class Loader), 메모리 영역(Memory Area), 실행 엔진(Execution Engine)으로 나뉜다.

1. 클래스 로더 (Class Loader)

클래스 로더는 자바 클래스 파일(.class)을 로드하여 JVM 메모리에 적재하는 역할을 한다.
클래스 로더는 필요한 클래스를 처음 사용할 때 로드하며, 이를 동적 로딩(Dynamic Loading)이라고 한다.

클래스 로더는 크게 세 가지 단계로 동작한다.

  • 로딩(Loading): .class 파일을 읽고 JVM 메모리에 적재한다.
  • 링크(Linking): 로드된 클래스의 검증 및 준비 작업을 수행한다.
  • 초기화(Initialization): 클래스의 정적 필드(static field)를 초기화하고, 필요한 코드들을 실행한다.

2. 메모리 영역 (Memory Area)

JVM은 프로그램을 실행하기 위해 여러 메모리 영역을 활용한다.
각각의 메모리 영역은 프로그램 실행에 필요한 데이터를 저장하거나 관리하는 역할을 한다.

(1) 메서드 영역 (Method Area)

  • 클래스의 메서드 코드, 변수 정보, 상수 등을 저장하는 공간이다.
  • 프로그램 실행 중에도 공유되며, 모든 스레드(Thread)가 접근할 수 있다.

(2) 힙 영역 (Heap Area)

  • 객체와 배열이 동적으로 생성되는 공간이다.
  • new 키워드를 사용하면 힙 영역에 객체가 생성되며, 가비지 컬렉터(GC)가 필요 없는 객체를 제거한다.
  • 메서드 영역과 마찬가지로 모든 스레드가 공유하는 공간이다.

(3) 스택 영역 (Stack Area)

  • 각 스레드마다 개별적으로 존재하는 메모리 공간이다.
  • 메서드가 호출될 때마다 스택 프레임(Stack Frame)이 생성되며, 메서드 실행이 끝나면 제거된다.
  • 지역 변수, 매개변수, 리턴 값 등이 저장된다.

(4) PC 레지스터 (PC Register)

  • 현재 실행 중인 바이트코드 명령의 주소를 저장하는 공간이다.
  • 스레드마다 별도로 존재하며, 어떤 코드가 실행 중인지 추적하는 역할을 한다.

(5) 네이티브 메서드 스택 (Native Method Stack)

  • 자바가 아닌 네이티브 코드(C, C++ 등)로 작성된 메서드를 실행할 때 사용된다.

3. 실행 엔진 (Execution Engine)

실행 엔진은 바이트코드를 실제로 실행하는 역할을 한다.
바이트코드는 기계어가 아니기 때문에, 실행 엔진이 이를 해석하고 변환하는 과정이 필요하다.
실행 엔진에는 인터프리터(Interpreter)와 JIT(Just-In-Time) 컴파일러가 존재한다.

(1) 인터프리터 (Interpreter)

  • 바이트코드를 한 줄씩 해석하고 실행한다.
  • 실행 속도가 상대적으로 느리지만, 즉시 실행할 수 있다는 장점이 있다.

(2) JIT(Just-In-Time) 컴파일러

  • 바이트코드를 한꺼번에 네이티브 코드(기계어)로 변환하여 실행 속도를 높인다.
  • 자주 실행되는 코드를 캐싱하여 프로그램의 성능을 최적화한다.
  • 단순 인터프리터보다 속도가 훨씬 빠르며, 현대 JVM에서는 기본적으로 JIT 컴파일러를 활용한다.

(3) 가비지 컬렉터 (Garbage Collector)

  • 힙 영역에서 사용하지 않는 객체를 자동으로 제거하여 메모리를 효율적으로 관리한다.
  • 개발자가 직접 메모리를 해제할 필요 없이 JVM이 알아서 메모리 관리를 수행한다.
  • JVM의 GC 알고리즘에는 여러 방식이 있으며, 최근에는 G1 GC가 많이 사용된다.

자바 프로그램의 실행 과정

자바 프로그램이 실행되는 과정을 단계별로 정리하면 다음과 같다.

1️⃣ 소스 코드 작성 (.java 파일)

  • 개발자가 자바 소스 파일을 작성한다.
  • 예: Main.java

2️⃣ 컴파일 (.class 파일 생성)

  • 자바 컴파일러(javac)가 .java 파일을 바이트코드(.class 파일)로 변환한다.

3️⃣ 클래스 로딩

  • JVM의 클래스 로더.class 파일을 메모리에 로드한다.

4️⃣ 바이트코드 실행

  • JVM 실행 엔진이 바이트코드를 해석(인터프리터)하거나 컴파일(JIT 컴파일러)하여 실행한다.

JVM의 역할을 다시 정리하면?

JVM은 단순한 프로그램 실행기가 아니라, 다양한 기능을 제공하는 강력한 실행 환경이다.

  • 운영체제(OS)와 독립적인 실행 환경 제공 → 어떤 OS에서도 동일한 코드 실행 가능
  • 클래스 로딩, 메모리 관리, GC, JIT 컴파일링 등 최적화 기능 수행
  • 자바 프로그램을 안전하게 실행하도록 보호

자바 개발을 하면서 JVM의 동작을 이해하면, 프로그램의 성능 최적화, 메모리 관리, 실행 흐름을 더 효과적으로 컨트롤할 수 있다.
따라서 JVM 구조를 잘 이해하는 것이 자바 개발자로서 중요한 기본 지식이 된다.

profile
개발자 희망생

0개의 댓글

관련 채용 정보