Java

[Java] JVM 구조와 원리

딸기케잌🍓 2021. 5. 23. 18:49

JVM은 Java Virtual MAchine의 약자 입니다.

OS와 자바 프로그램 사이에서 프로그램이 실행되는데 필수적인 환경을 제공해 줍니다.


JVM은 크게
Garbage collector,
Execution Engine,
Class Loader,
Runtime Data Area 4개의 영역으로 구성되어 있습니다.

또 Runtime Data는 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 구성되어 있습니다.

 

 

JVM의 대표적 기능은 다음과 같습니다.

1. 운영체제에 상관없이 어디서든 자바 코드가 실행될 수 있게 한다.
2. GC(Garbage Collectoin) 기능을 제공한다.

 

 

JVM 구조

JVM 구조

 

JVM 구조

 

Java Compiler

Java로 코드를 작성하면 .java파일이 생성되고 java compiler가 .java 파일을 .class 파일로 변환시킵니다.

.class 파일은 바이트 코드 명령어로 되어있습니다. Java compiler는 JVM 밖의 영역입니다.

 

 

Class Loader

.class 파일을 메모리에 올립니다.

바이트코드 검사기가 바이트 코드 명령어가 적절한지 아닌지 검사합니다. 만약, 의심스러운 명령어가 발견되면 그 다음 프로세스 단계들을 실행하지 않습니다.

바이트코드가 적합하다면 프로그램을 실행하기 위해 필요한 메모리를 Run time data 영역에 할당합니다.

 

클래스가 로딩되는 절차
1. 로딩 : 클래스 파일이 JVM 메모리 위에 로딩됩니다.
Verifying : 자바 언어 스펙과 JVM 스펙과 일치하는지 검증단계를 거칩니다. 가장 오래 걸리고 복잡한 테스트 과정을 거칩니다.
Preparing :

 

 

 

 

Execution Engine

 

Class Loader에 의해 Runtime Data Area에 적재된 .class 파일들을 하나의 명령 단위로 읽어서 컴퓨터가 이해할 수 있는 기계어로 번역하고 명령을 실행합니다. Interpreter 방식과 JIT(Just-In-Time)방식이 존재합니다.


로딩된 클래스들의 바이트코드를 해석(Interpret) 하여 바이트 코드를 바이너리 코드로 변경합니다.

JIT 컴파일러가 바이트 코드를 컴파일하고 native code로 변환시킵니다. native code는 실행엔진이 바로 실행시킬 수 있는 코드입니다.

인터프리터도 바이트코드를 한 줄씩 실행시킬 수 있습니다. 하나의 바이트코드는 빠르게 해석할 수 있지만 해석된 결과를 실행시키는 것은 느립니다. JIT 컴파일러가 훨씬 빠르게 실행시킬 수 있습니다.

 

실행엔진은 인터프리터와 JIT compiler 두 파트로 구성됩니다. 

바이트 코드 명령어를 기계어로 변환하여 실행가능한 상태로 만듭니다.

JVM 은 인터프리터와 JIT compiler 두 개를 모두 사용합니다.

 

 

 

Runtime Data Area

JVM OS로부터 할당 받는 메모리 영역입니다.

Method Area, Heap Area, Stack Area, PC register, Native Method Stack 총 5가지로 구분됩니다.


Method Area(Static Area)
패키지 클래스, 인터페이스, 상수, static변수, final 변수, 클래스 멤버 변수, 메소드 등 로드된 후 메모리에 항상 상주하고 있는 영역으로 모든 스레드가 공유합니다.

Heap Area
메서드 안에서 사용되는 객체들을 위한 영역으로 new를 통해 생성된 객체, 배열, immutal 객체 등의 값이 저장됩니다.

GC가 수행되는 영역이고, 모든 스레드가 공유합니다.

Stack Area

메소드 코드는 Method Area에 저장되지만 메소드를 실행하는 동안에는 데이터와 메소드 결과를 따로 보관할 메모리가 필요한데 이 저장소가 Stack Area입니다.

스택은 Java 메서드가 실행되는 메모리 영역입니다. Java 스택에서는 메서드가 실행되는 별도의 프레임이 생성됩니다.

메소드 안에서 사용되는 값들(매개변수, 지역변수, 리턴값)이 저장되는 영역입니다.

메서드가 호출 될 때마다 스택에 새 프레임이 생성됩니다. 메소드 호출이 완료되면 연관된 프레임이 소멸됩니다. JVM은 항상 각 메서드를 실행하기 위해 별도의 스레드 (또는 프로세스)를 만듭니다.
스레드마다 하나씩 존재하며 쓰레드가 시작될 때 할당됩니다.

PC register
쓰레드가 생성될 때마다 생성되는 영역으로 현재 쓰레드가 실행되는 부분의 주소를 저장하고 있는 영역입니다. 쓰레드 별로 하나씩 생성됩니다.

Native Method Stack
자바 이외의 다른 언어에서 제공되는 Method의 정보가 저장됩니다.다른 언어(C/C++)의 메소드 호출을 위해 할당되는 구역 언어에 맞게 Stack이 형성되는 구역이다. 

 

 

Garbage Collector(GC)

JVM에서 Runtime Data Area중 Heap 영역에서 더 이상 사용하지 않는 메모리들을 제거하는 역할을 합니다.

 


JRE(Java Runtime Environment)


자바 어플리케이션을 실행하기 위한 최소 배포 단위입니다.
JVM과 필요한 library가 포함됩니다. 실행이 목적이라 개발 관련 도구는 포함되지 않습니다.


JDK

JRE+개발에 필요한 툴이 포함됩니다.



 

 

 

 

 

Reference

https://www.researchgate.net/figure/Basic-components-of-the-Java-Virtual-Machine_fig1_2244414
https://www.guru99.com/java-virtual-machine-jvm.html
https://ahea.wordpress.com/2017/05/25/%EC%9E%90%EB%B0%94%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-jvm%EA%B3%BC-garbage-collection/
https://gowoonsori.site/java/jvm/
https://techvidvan.com/tutorials/java-virtual-machine/
https://developpaper.com/java-virtual-machine-jvm-interview-questions-2020-latest-edition/
https://hellokangning.github.io/post/jvm-series-overview/
https://honbabzone.com/java/java-jvm/
https://developpaper.com/java-virtual-machine-jvm-interview-questions-2020-latest-edition/ c
https://www.scientecheasy.com/2021/03/what-is-jvm.html/

'Java' 카테고리의 다른 글

java length  (0) 2021.08.20
[Java] 컴파일러 vs 인터프리터 vs JIT compiler  (0) 2021.05.31
[Java] Static 변수, static 메소드  (0) 2021.05.23
[Java] String, StringBuffer, StringBuilder  (0) 2021.04.22
[Java] JavaAgent  (0) 2021.01.17