본문 바로가기
자바

자바가상머신 (JVM)

by 근즈리얼 2021. 8. 13.
728x90

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 변수, 메서드의 바이트코드 등을 보관한다.

728x90

댓글