JVM이란 자바 가상 머신(Java Virtual Machine) 을 줄여서 부르는 용어이다.
(가상머신이란 프로그램을 실행하기 위해 물리적인 머신과 유사하게 소프트웨어로 구현한 것!)
※ JVM의 역할
- 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것
- JAVA와 OS 사이에서 중개자 역할을 하여 OS에 구애받지 않고 재사용 가능하게 함
- 메모리관리, Garbage collection을 수행
◆ 자바 프로그램의 실행 과정
step1. 프로그램이 시작되면 JVM은 운영체제(OS)로부터 필요한 메모리를 할당 받는다.
이때, JVM은 용도에 따라 메모리를 여러 영역으로 나누어 관리한다.
step2. 자바 컴파일러(javac)가 자바소스(.java)읽어들여 자바 바이트코드(.class)로 변환시킨다.
step3. Class Loader를 통해 Class파일들을 JVM으로 로딩한다.
step4. 로딩된 class파일들은 Execution engine을 통해 해석된다.
step5. 해석된 바이트코드는 Runtime Data Area에 배치되어 실직적인 수행이 이루어진다.
이때 Class의 객체(clazz)의 형태로 메소드 영역에 배치된다.
(+) 실행과정 속에서 JVM은 필요에 따라 Thread Synchronization과 GC 같은 관리작업을 수행한다.
◆ JVM의 구성
▶ Class Loader(클래스 로더)
- JVM 내로 클래스파일(.class파일)을 로드하고, 링크를 통해 배치하는 작업을 수행
- Runtime 시에 동적으로 클래스를 로드하여 jar 파일 내에 저장된 클래스들을
JVM이 OS로부터 할당받은 메모리영역인Runtime Data Area에 적재하는 역할
▶Execution Engine(실행 엔진)
- Class Loader에 의해 메모리에 적재된 클래스(바이트 코드)들을
기계어로 변경해 명령어 단위로 클래스를 실행하는 역할
▶Garbage Collector
- Garbage Collector(GC)는Heap메모리 영역에 생성(적재)된 객체들 중에
참조되지 않는 객체들을 탐색 후 제거하는 역할
▶Runtime Data Area
- JVM이 운영체제로부터 할당받은 메모리영역
-자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는영역
다시 말해, Class Loader에서 준비한 데이터들을 보관하는 저장소
◆ Runtime Data Area
프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눠 관리된다.
1. Method area (메소드 영역/클래스 영역)
클래스 객체가 저장되는 영역으로 클래스 객체를 통해 필드정보, 메소드 정보, 타입정보를 알 수 있다.
- Field Information : 필드의 이름, 타입, 접근 제어자 - Method Information : 메소드의 이름, 리턴타입, 매개변수, 접근 제어자 - Type Information : class인지 interface인지 여부/ Type의속성, 전체 이름 등
2. Heap area (힙 영역)
new 키워드로 생성된 인스턴스와 배열 객체가 생성되는 영역
(이때, 메소드 영역에 로드된 클래스만 생성이 가능)
(+) Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이도 함
3. Stack area (스택 영역)
지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역
<예시>
클래스 Person p = new Person(); 이라는 소스를 작성했다면 Person p는 스택 영역에 생성되고 new로 생성된 Person 클래스의 인스턴스는 힙 영역에 생성된다. 그리고 스택영역에 생성된 p의 값으로 힙 영역의 주소값을 가지고 있다. 즉, 스택 영역에 생성된 p가 힙 영역에 생성된 객체를 가리키고(참조하고) 있는 것이다.