JVM이란?
- 자바가상머신의 줄임말이다.
- 자바 프로그램을 JVM을 통해 실행시킨다.
- 가상 머신이라는 프로그램을 실행시키기 위해 물리적으로 유사한 머신을 소프트웨어로 구현한 것이다.
JVM을 사용하는 이유
- 크게 두가지로 생각할 수 있다.
1. OS에 상관없이 자바 프로그램을 실행시키기 위해서!
- JVM은 자바 프로그램과 OS사이에서 중개자 역할을 하며 자바 프로그램이 OS의 메모리를 사용하는 것을 도와준다.
따라서 window, mac에 관계없이 프로그램을 실행시킬 수 있다.
-> 플랫폼의 독립적
2. 편리한 메모리 사용!
- JVM은 메모리 관리를 직접해준다. 메모리를 직접 할당하고 해지해야 하던 C프로그램과 다르게 JVM은 메모리를 관리해주는 기능이 있다.
JVM 실행 과정
1. 프로그램이 실행 되면 jvm이 os로부터 필요한 메모리를 할당받는다. 그 후 jvm은 필요에 맞게 메모리를 여러 영역으로 나누어 관리한다.
2. .java파일을 자바 컴파일을 통해 .class로 만든다 - 자바 소스파일 -> 자바 바이트 파일
3. Class Roder를 통해 .class파일들을 jvm으로 로딩한다.
4. 옮겨진 파일들은 Execution을 통해 해석된다.
5. 해석된 파일들은 Runtime Data Areas에 배치된다.
** 아래 그림에서 가장 큰 사각형이 JVM이다.
JVM 구성 설명
Java Compiler
- java source 파일을 Byte code로 바꿔주는 역할을 한다.
Class Roder
- jvm의 excecution engine이 잘 실행될수 있도록 하기 위해 .class파일들을 읽고 Runtime Date Areas로 데이터를 옮긴다.
Excecution Engine
- 클래스를 실행시키는 역할을 한다.
- 데이터 영역의 적재된 바이트 코드들을 실제 jvm 내부에서 기계가 실행할 수 있는 형태로 변경한다.
- 두가지 방법을 사용
* interpreter
- 명령어를 바로 해석하고 실행
* JIT(just - in - time)
- java 파일 -> byte 파일 -> 기계어
- 이런 과정에서 작업의 비용이 증가한다. 이런 비용을 최소화하기 위해 자주 쓰이는 기계어를 미리 변환시켜놓고 저장한 뒤 필요한 시점에 다시 꺼내 사용한다.
-
위의 방법이 JIT방법이다- 한번 저장되고 자주 사용한다면 실행속도가 많이 증가하겠지만 처음에 저장하는 시간이 있기 때문에 많이 사용하지 않을 때는 오히려 손해를 볼수 있다.
Runtime Data Area
- 프로그램을 수행하기 위해 os로부터 할당받은 데이터 영역
- 런타임 데이터 영역은 5개의 영역으로 나눌 수 있다.
- PC 레지스터, JVM 스택, 네이티브 메서드 스택 -> 스레드마다 하나씩 생성되며
- 힙, 메서드 영역 -> 모든 스레드가 공유해서 사용한다.
PC 레지스터
- 각 스레드마다 하나씩 생성된다.
- CPU의 Register와 역할이 비슷하다. 현재 수행 중인 JVM명령의 주소 값이 저장된다.
스택 AREA
- 각 스레드마다 하나씩 생성된다.
- Method안에서 사용되는 값들(매개변수, 지역변수, 리턴 값 등)이 저장되는 구역이다.
- 메서드가 호출될 때 LIFO로 하나씩 생성되고, 메서드 실행이 완료되면 LIFO로 하나씩 지워진다.
네이티브 메서드 스택
- jvm은 네이티브 방식을 지원한다.
- 일반적인 메소드를 사용할 경우 jvm 스택에 쌓이다가 해당 메소드 내부에서 네이티브 방식을 사용하는 메소드가 있다면 네이티브 메소드 스택에 쌓인다.
Heap Area
- 동적으로 할당되는 데이터가 저장되는 영역이다.
- 예를 들면 new 명령어를 이용한 클래스 인스턴스, 배열 등이 있다.
- Heap에 할당된 데이터는 Garbage Collection의 대상이된다.
Method Area
- 모든 스레드가 공유하는 영역으로 JVM이 시작될 때 생성된다.
- JVM이 읽어 들인 모든 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메서드 코드, Static 변수, 메서드의 바이트코드 등을 보관한다.
'자바' 카테고리의 다른 글
[자바] 문자열리스트안에 특정 문자열 제거 후 맨 마지막으로 이동시키기 (1) | 2023.05.08 |
---|---|
Map을 활용한 이중 for문 줄이기 (0) | 2023.03.22 |
자바 8 stream API (0) | 2021.07.24 |
자바 8 stream 기본 (0) | 2021.07.23 |
인터페이스 기본 메소드(Default Methods) (0) | 2021.07.16 |
댓글