JVM이란 무엇인가?
JVM(Java Virtual Machine)은 자바 프로그램을 실행하기 위한 가상 머신이다. 자바는 플랫폼 독립적인 언어인데, 이는 자바 코드가 특정 운영체제나 하드웨어에 종속되지 않기 때문이다. 자바 코드가 한 번 컴파일되면 .class 파일이 생성되고, 이 파일을 다양한 환경에서 실행할 수 있도록 해주는 것이 바로 JVM이다.
JVM의 구조
클래스 로더(Class Loader)
클래스 로더는 자바 클래스 파일을 메모리에 적재하고, 런타임에 필요한 클래스들을 동적으로 로딩한다. 이 과정은 크게 세 단계로 나누어 진다.
- 로딩(Loading): 바이트코드를 메모리에 적재
- 링크(Linking): 레퍼런스 해결 및 검증
- 초기화(Initialization): 정적 초기화 블록 실행
메모리 영역 (Runtime Data Area)
JVM은 프로그램을 실행하기 위해 메모리를 여러 영역으로 나누어 관리한다.
- 메소드 영역(Method Area): 클래스 구조, 메소드 데이터, 상수 풀 등을 저장하는 공간.
- 힙(Heap): 객체를 저장하는 메모리 영역. 가비지 컬렉션의 대상이 되는 영역이다.
- 스택(Stack): 각 스레드가 사용하는 메소드 호출과 관련된 로컬 변수 및 메소드 호출 기록을 저장하는 영역이다.
- PC 레지스터(PC Register): 스레드가 실행 중인 JVM 명령어 주소를 저장한다.
- 네이티브 메소드 스택(Native Method Stack): 자바 외부의 네이티브 코드(C, C++ 등)를 호출할 때 사용하는 스택이다.
💡 Runtime Data Area (JVM 메모리) 영역에 따른 3가지 Java 의 변수 분류
정적(클래스) 변수 (Static Variable) : 클래스 내 필드/메서드와 정적 필드/메서드 ⇒ Method/Static 영역
인스턴스(객체) 변수 (Instance Variable) : new 키워드로 인스턴스 생성 시 생성자로 적재 ⇒ Heap 영역
지역 변수 (Local Variable) : 메서드 호출 시 필요한 파라미터나 내부 변수이기에 ⇒ Stack 영역
실행 엔진(Execution Engine)
실행 엔진은 바이트코드를 실제로 실행하는 역할을 한다. 주요 구성 요소는 다음과 같다.
- 인터프리터(Interpreter): 바이트코드를 한 줄씩 해석하여 실행한다. 하지만 인터프리터 방식은 느리기 때문에 자주 실행되는 코드는 JIT 컴파일러가 최적화한다.
- JIT(Just-In-Time) 컴파일러: 바이트코드를 런타임에 기계어로 변환하여 성능을 높인다.
- 가비지 컬렉터(Garbage Collector): 사용하지 않는 객체를 자동으로 메모리에서 해제한다.
JVM의 작동 원리
- 자바 컴파일러(javac)는 자바 소스 코드를 바이트코드로 컴파일하여 .class 파일을 생성한다.
- JVM의 클래스 로더는 .class 파일을 읽어 메모리에 적재한다.
- 실행 엔진이 바이트코드를 실행하여 프로그램을 구동시킨다.
- 인터프리터 방식으로 코드를 해석하거나, JIT 컴파일러가 자주 사용되는 코드를 기계어로 변환하여 성능을 높인다.
- 프로그램 실행 중 생성된 객체는 힙에 저장되고, 더 이상 필요하지 않은 객체는 가비지 컬렉터에 의해 자동으로 제거된다.
💡 가비지 컬렉션(Garbage Collection)
가비지 컬렉션은 JVM의 중요한 기능 중 하나다. 메모리 관리를 자동으로 처리하기 때문에 개발자가 명시적으로 메모리 해제를 신경 쓰지 않아도 된다. JVM은 다양한 가비지 컬렉션 알고리즘을 사용하며, 각 알고리즘은 성능과 메모리 사용 간의 트레이드오프를 가진다.
Serial GC: 단일 스레드를 사용하여 가비지 컬렉션을 수행한다. 단순하지만 성능이 낮다.
Parallel GC: 여러 스레드를 사용하여 가비지 컬렉션을 병렬로 수행하여 성능을 높인다.
G1(Garbage First) GC: 힙을 여러 영역으로 나누어 관리하고, 우선순위가 높은 영역부터 가비지 컬렉션을 수행하여 짧은 GC 일시 중지를 제공한다.
참고문헌
[JAVA] JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...)
JVM이란 무엇인가 Java Virtual Machine의 줄임말. 직역하면 '자바를 실행하기 위한 가상 기계(컴퓨터)'라고 할 수 있다. Java 는 OS에 종속적이지 않다는 특징을 가지고 있다. OS에 종속받지 않고 실행되
doozi0316.tistory.com
'Backend > Java' 카테고리의 다른 글
[Java] DTO와 VO의 차이점 (0) | 2024.10.15 |
---|---|
[Java] 객체 생성 방법 (0) | 2024.10.15 |
[Java] 자바 캡슐화의 이해 (Encapsulation) (2) | 2024.10.09 |
[Java] Exception - 자바 예외 처리 (1) | 2024.10.07 |
[Java] JDK와 JRE의 개념과 차이점 (2) | 2024.09.30 |