[JAVA] JVM
This is JAVA :)
JVM이란?
JVM(Java Virtual Machine, 자바 가상 머신)은 자바 바이트 코드를 실행할 수 있는 주체이다.
JVM의 역할
- Java와 OS를 연결하며, Java가 OS에 독립적으로 실행되도록 한다.
(대신 JVM이 운영체제에 종속적이다) - Java 애플리케이션을 Class Loader를 통해 읽어들여 Java API와 함께 실행
- 메모리 관리(Garbage Collection)을 수행
JVM 실행과정
- 프로그램이 실행되면 OS에서 JVM에 메모리를 할당한다.
JVM은 할당받은 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. - 자바 컴파일러(javac)가 자바 소스(.java)를 읽어 자바 바이트코드(.class)로 변환시킨다.
- 자바 바이트코드를 Class Loader를 통해 JVM 메모리 영역(Runtime Data Areas)으로 로딩한다.
- 자바 바이트코드는 Execution engine을 통해 해석된다.
-
해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어진다.
이러한 과정에서 JVM은 필요에 따라 Thread Synchronization과 GC같은 관리 작업을 수행한다.
JVM 내부 모듈
1. Class Loader
- JVM내로 클래스를 Load해서 Runtime Data Areas에 배치
- 동적으로 클래스를 로드(컴파일 타임이 아닌 런타임에 클래스를 참조할 때 해당 클래스를 로드)
2. Runtime Data Areas
- JVM이라는 프로그램이 OS에서 실행되면서 할당받는 메모리 영역
- PC Register, JVM Stack, Native Method Stack은 스레드마다 생성, Heap, Method Area는 모든 스레드가 공유
- PC Register
- 레지스터는 스레드마다 생성
- 스레드가 어떤 명령어로 실행되어야 할지를 기록하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다.
- Stack Area
- 스택은 스레드마다 생성
- 지역변수, 매개변수, 메소드 정보, 연산 중 발생하는 임시 데이터 등을 저장
- 메서드가 호출될 때마다 스택 프레임을 생성
- Native Method Stack
- Java가 아닌 다른 언어(바이트코드가 아닌 실제 실행할 수 있는 기계어)로 작성된 코드를 위한 영역
- JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 실행
- Heap Area
- 모든 스레드가 공유하는 영역
- Runtime에 동적으로 할당되는 데이터가 저장되는 영역 (객체, 배열 등)
- Heap에 할당되는 데이터는 GC의 대상
- JVM 성능 등의 이슈에서 가장 많이 언급되는 영역
- Method Area (Class Area, Code Area, Static Area)
- 모든 스레드가 공유하는 영역
- JVM이 시작될 때 생성
- 각 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메서드 static 변수, 메서드의 바이트 코드 등을 보관
- Runtime Constant Pool
- Method Area 내부에 존재하는 영역
- 어떤 메서드나 필드를 참조할 때 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조하여 중복을 막는 역할
3. Execution Engine
- Load된 클래스의 바이트코드를 실행하는 Runtime Module
- Class Loader를 통해 JVM 내의 Runtime Data Areas에 배치된 바이트 코드를 기계어로 변환 후 실행
- 바이트 코드를 기계어로 변환하는 방식
- 1) Interpreter
- 바이트 코드를 한줄씩 실행해서 속도가 느림
- 한번만 실행하는 코드에 적합
- 2) JIT(Just-In-Time) Compiler
- Interpreter의 단점을 보완
- 바이트 코드 전체를 컴파일하고 해석한 코드를 캐시에 보관해서 재실행시 빠르게 실행
- 1) Interpreter
4. Java Native Interface (Native Method Interface)
- Java와 다른 언어를 연동하는 솔루션
- Java가 다른 언어로 만들어진 애플리케이션과 상호 작용할 수 있는 인터페이스 제공
- JVM이 원시 메소드(native method)를 적재(locate)하고 수행(invoke)할 수 있도록 한다.
- 운영체제의 고유기능을 Java로 해결하는 것이 아닌 운영체제가 구현된 언어(보통 C, C++)로 운영체제의 고유기능을 만든다.
- JVM이 C, C++로 만들어진 고유 기능, 즉 함수를 Java 메서드와 연결해준다.
- JNI를 사용하는 이유
- 1) Java가 Native Code(플랫폼에 종속적인 기계어 코드)에 비해 느리다.
- 2) Java에서 지원되지 않는 OS의 특정 기능
- OS에서 제공하는 모든 기능을 JVM에서 제공할 수 없기 때문에
5. Native Method Libraries
- 네이티브 메소드 실행에 필요한 라이브러리
참고
Java, JVM 이란
Java 가상 머신(JVM)이란?
JVM Internal
JVM Explained
#자바가상머신, JVM(Java Virtual Machine)이란 무엇인가?
JNI (Java Native Interface) 란 ?
JAVA - JNI 사용하기
알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC
자바 메모리 관리 - 스택 & 힙
[JAVA/자바] 메모리 구조(static, stack, heap)
[Java] JVM 메모리 구조
자바의 메모리 구조 1. 메소드 영역
[JVM Internal] JVM 메모리 구조
Leave a comment