티스토리 뷰

Java/기본기

[Java 기본] I-1. JVM이란 무엇인가

Jason of the Argos 2021. 7. 13. 00:56

다루는 내용

1. JVM이란 무엇인가

2. JVM의 구성요소

 

JVM이란 무엇인가

Java Virtual Machine (JVM)은 Java 또는 다른 언어들로 작성된 프로그램을 실행할 수 있도록 하는 가상머신이다. Java는 WORA(Write Once Run Anywhere: 한번 작성된 코드를 수정없이 어디서든 실행할 수 있다) 하도록 설계된 언어인데, 환경과 관계없이 실행될 수 있도록 하드웨어 위에 JVM이라는 가상머신이 있는 것이다. (Java는 정말 WORA할까?)

JVM은 Java를 비롯한 여러 프로그래밍 언어(Kotlin, Groovy, 등)로 작성된 바이트코드를 해석하고 실행한다.

(바이트코드란 무엇인가)

 

JVM 구성요소

1) 클래스로더

2) 런타임데이터 영역

3) 실행엔진

 

출처: https://dzone.com/articles/jvm-architecture-explained

클래스로더

클래스로더의 가장 핵심 기능은 .class 파일형식의 바이트코드를 인식하고 로드하는 것이다. 클래스로더는 다음 3가지 기본적인 기능을 반드시 차례대로 실행해야한다.

 

1) Loading: 타입에 대한 바이너리 데이터를 찾고 가져온다.

 

2) Linking: 3가지 작업을 한다.

                 Verification: 불러온 데이터 타입이 맞는지 확인한다.

                 Preparation: 클래스 변수에 필요한 메모리를 할당하고 할당한 메모리를  default값으로 초기화한다.

                 Resolution: symbolic reference를 direct reference로 변환시킨다.

 

3) Initialization: 클래스 변수 초기화에 해당되는 자바 코드를 실행시킨다.

 

런타임데이터 영역

런타임데이터 영역은 5가지 구성으로 나뉘어진다

1) 메소드 영역: 모든 클래스 레벨 데이터는 여기에 저장된다(static 변수도). 하나의 JVM에는 오직 하나의 메소드 영역이 있다.

 

2) 힙 영역: 모든 객체와 그에 해당되는 인스턴스 변수, 배열은 여기에 저장된다. 힙영역도 JVM마다 오직 하나 밖에 없다.  메소드 영역과 힙 영역은 오직 하나만 있고 여기에 저장되는 데이터는 여러 스레드에 의해 사용되기 때문에 thread-safe하지 않다. 

 

3) 스택 영역 : 각 thread마다 각자의 런타임 스택이 생성된다. 그리고 각 메소드 호출마다 스택 메모리에 스택 프레임이 하나씩 들어간다. 이 스택 프레임에 각 지역변수들이 생성되며, 공유 자원이 아니기 때문에 thread-safe하다.

 

4) PC 레지스터: 각 스레드는 각자의 PC레지스터를 가지고 있다. 이 PC레지스터는 현재 실행되고 있는 명령어의 주소를 가지고 있으며, 해당 명령어가 실행되면 PC레지스터는 다음 명령어의 주소로 업데이트 된다.

 

5) Native 메소드 스택: native 메소드 정보를 담고 있다고 한다.

 

실행엔진

런타임데이터 영역에 할당된 바이트코드는 이제 실행엔진에 의해서 실행된다.

 

1) 인터프리터: 인터프리터는 바이트코드를 해석하고 실행시킨다. (실행속도는 비교적 느리다고 한다). 인터프리터는 한 줄씩 읽어가면서 실행하는 방식이기 때문에, 한 가지 메소드를 여러 번 호출하면 그만큼 비효율적이다.

 

2) JIT 컴파일러: 인터프리터의 단점을 보완하기 위해 있는 것이 JIT 컴파일러다. 반복되서 실행되는 코드를 찾아서 성능이 좋은 native 코드로 바꿔서 메소드 호출이 생길때마다 이것을 실행시킨다. (JIT 컴파일러란 무엇이며 어떻게 동작하는가?)

 

3) GC: unreferenced 객체를 찾아내고 메모리에서 지운다. 

 

4) Java Native Interface(JNI): Native 메소드 라이브러리를 사용하며 실행엔진이 필요한 Native 라이브러리를 제공한다.

 

5) Native 메소드 라이브러리: Native Library의 콜렉션이다.

 

Summary

JVM을 들을 때마다 왜 VM이라고 했는지 이해가 잘 가지 않았다. 내가 아는 VM은 현재 사용하고 있는 OS 위에 또 하나의 OS를 돌리는 거밖에 없었는데 JVM의 구성요소를 보고 각 구성요소의 역할을 보니 왜 Virtual Machine이라 하는지 알게되었다. 마치 하나의 하드웨어처럼 PC 레지스터, 시스템 스택, 메모리가 다 갖추어져 있어서 어느 OS이던 이 가상의 머신이 마치 독립적인 자바 프로그램용 하드웨어처럼 작동해서 실행시키는 것이었다.

 

참조:

1) https://d2.naver.com/helloworld/1230

2) https://www.itworld.co.kr/news/110837

3) https://en.wikipedia.org/wiki/Java_virtual_machine

4) https://asfirstalways.tistory.com/158

5) https://dzone.com/articles/jvm-architecture-explained

 

'Java > 기본기' 카테고리의 다른 글

[JAVA8] 6. Optional  (0) 2022.04.17
[JAVA 8] 3. 스트림의 기본  (0) 2022.03.13
[JAVA 8] 1. 동작 파라미터화  (0) 2022.02.19
[JAVA] Java는 정말 WORA할까?  (0) 2021.08.11
[JAVA] Wrapper 클래스는 왜 있는 걸까?  (0) 2021.03.05