본문 바로가기
언어/Java

JVM

by 넬준 2021. 5. 18.

Java Virtual Machine으로,

자바 컴파일러가 자바 소스코드를 컴파일한 자바 바이트코드

각 OS에 맞게 이해할 수 있도록 기계어로 변환해주는 역할을 한다.

운영체제 위에서 작동하는 응용프로그램이다.

 

C와 같은 언어는 운영체제 바로 위에서 직접 실행되지만,

Java는 JVM이 운영체제 위에서 작동하고 있고, 그 JVM 위에서 Java가 돌아간다.

즉, Java와 OS 사이 중개자 역할이라 보면 된다.

 

JVM 구조

JVM 구조

1. Java를 실행하면 일단 JVM은 OS로부터 메모리를 할당 받는다. JVM은 이를 적절히 잘 분배하면서 관리한다.

 

2. 작성한 자바 소스코드.java를 자바 컴파일러가 자바 바이트코드.class로 컴파일 한다.

 

3. 그러면 Class Loader는, 이런 식으로 생성된 .class파일들을 모아 JVM이 할당받은 메모리 영역인 Runtime Data Area에 로딩한다. 자바 애플리케이션이 실행 중일 때 로딩한다(동적로딩).

 

4. 그러고 나면 Execution Engine은 로딩된 class 파일들을(byte 코드 형태) 기계어(binary 코드 형태)로 컴파일하여 명령어 단위로 실행한다. 실행방식에는 interpreter를 이용한 방식이 있고, JIT compiler를 이용한 방식이 있다.

 

Interpreter방식과 Compiler방식

프로그래밍 언어를 해석하고 실행하는 방법으로, 대부분의 프로그래밍 언어는 둘 중에 한 가지 방식을 사용 하지만 Java는 이 두 방식을 모두 사용한다.

- compiler 방식
runtime 이전에 기계어로 해석하고 구동하는 방식
runtime 이후에는 하나의 패키지로 빠르게 작동한다.
번역속도는 느리지만 한번 번역하고나면 실행속도는 빠르다.
runtime에 시스템으로부터 메모리를 할당받아, 기계어로된 목적코드를 생성할 때 사용한다.
전체를 번역하고 한번에 실행한다.
프로그램을 일부분만 변경하더라도 전체를 다시 컴파일해야 한다.

- interpreter 방식
runtime에 한 줄씩 해석하며 실행하는 방식
runtime에 직접 해석하여 구동하기 때문에 번역속도는 빠르지만 실행속도는 느리다.
하지만, runtime에 실시간으로 debugging과 수정이 가능하다.
대부분의 script 언어에서 사용한다.

수정이 자주 필요한 부분에 대해선 interpreter방식을 사용하는 script언어로 따로 빼놓기도 한다.
interpreter방식의 느린 실행속도를 보완하기 위해 JIT compiler 방식을 사용하기도 한다.

* JIT compiler
 번역된 코드를 caching해두고서 다음에 같은 코드가 있다면 interpret하지 않고, 아까 caching해둔 코드를 사용하여 반복적으로 기계어가 생성되지 않게 한다. interpreter방식과 compiler방식을 적절히 혼합한 방식이다.

 

JVM은 운영체제로부터 할당받은 메모리 영역(Runtime Data Area)을 Method area, Stack area, Heap area로 나눠서 사용한다.

 

 

 

 

(추가)

https://jinyoungchoi95.tistory.com/4

https://blog.wanzargen.me/category/Programming/Java

https://honbabzone.com/java/java-static/

 

'언어 > Java' 카테고리의 다른 글

Java 기본 6 - 추상클래스  (0) 2021.05.24
Java 기본 5 - Enum  (0) 2021.05.23
연산자  (0) 2021.05.20
자료형  (0) 2021.05.20
Java 기본 1  (0) 2021.05.17

댓글