JVM이란?
JVM은 Java Virtual Machine으로, Java와 OS 사이에서 중간자 역할을 수행합니다.
JVM은 자바 컴파일러(javac)에 의해 소스코드 (.java)로 부터 변환된 자바 바이트코드(. class)를 해당 OS에 맞게 해석해주는 역할을 수행합니다.
효과
이때, 자바 컴파일러에 의해 생성되는 자바 바이트 코드는 기계어가 아니라 OS에서 바로 해석할 수 없습니다.
기존의 C와 같은 언어는 소스를 컴파일하면 OS에서 바로 실행될 수 있는 실행파일 즉 기계어로 컴파일되는 반면, 왜 자바와 같은 JVM언어는 바로 기계어로 컴파일하지 않고, 중간에 바이트 코드로 변환하여 JVM이 바이트 코드를 실행하는 방식을 사용할까?
기존의 C와 같은 언어 방식은, 운영체제가 바뀔때 마다 그에 맞는 실행 가능한 파일을 만들어줘야 합니다. 반면에 자바와 같은 JVM언어는 JVM이 해석할 수 있는 바이트코드로의 변환 과정을 추가하여, 이러한 불편한 점을 해소했다
결과적으로 OS에 종속적이지 않고 Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행할 수 있습니다.
JVM 구조
JVM은 크게 네가지의 구성요소로 볼 수 있다.
- Class Loader
- Execution Engine
- Runtime Data Area
- Garbage Collectors (GC)
Class Loader
바이트 코드를 실행할 때, class 객체를 메모리 상에 로드하는 요소, 클래스의 인스턴스를 생성하면, Class Loader에 의해 메모리에 로드한다
Execution Engine
Class Loader에 의해 메모리에 로드된 바이트코드를 실행하는 요소.
Class Loader에 의해 Runtime Data Area에 배치된 바이트코드는 Execution Engine에 의해 실행된다.
Runtime Data Area
JVM의 메모리 영역으로 Method 영역과, Heap 영역은 모든 스레드에서 공유하며, 스택 영역과 네이티브 메서드 스택 영역 등은 스레드 별로 독립적인 메모리 공간을 갖습니다.
- Method 영역
- 프로그램 실행 중 클래스가 사용되면 JVM은 해당 클래스 파일을 읽어서 분석하여 클래스의 인스턴스 변수, 메소드 코드 등을 Method Area에 저장한다. 이때 클래스 변수도 이 영역에 함께 생성된다.
- Heap 영역
- 사용자가 관리하는 인스턴스가 생성되는 공간으로 객체를 동적으로 생성하면 인스턴스가 Heap 영역의 메모리에 할당되어 사용된다.
- Heap영역은 Garbage Collection의 대상이 되는 영역이다.
- 스택 영역
- 프로그램 실행 중 발생하는 메서드 호출과 복귀에 대한 정보를 저장.
- 네이티브 메소드 스택 영역
- 자바 이외의 C언어와 같은 언어가 필요한 경우, JNI (Java Natvie Interface) 기술을 통해서 네이티브 메소드들이 바이트코드로 변환되면서 사용되고 기록되는 영역.
GC
더 이상 참조하지 않는 Heap 영역의 메모리를 정리해준다.
'Application > JAVA & Kotlin' 카테고리의 다른 글
Java 제네릭 (0) | 2021.08.01 |
---|---|
Java Thead (1) | 2021.07.31 |
[모던 자바 인 액션 정리] 7장. 병렬 데이터 처리와 성능 (2) | 2020.12.30 |
[모던 자바 인 액션 정리] 4장. 스트림 소개 (0) | 2020.12.30 |
[모던 자바 인 액션 정리] 3장. 람다 표현식 (0) | 2020.12.24 |