본문 바로가기

Java

JVM

JVM이란?

- Java Virtual Machine

 


목표

- JVM의 역할 이해

- JVM의 내부 구조 이해

 


본문

 

1) JVM의 3가지 개념

- JVM은 3가지 개념을 담고 있습니다. 그것은 명세, 구현, 인스턴스입니다. 

 

명세 - JVM은 자세한 설계도가 아닌 이렇게 저렇게 해야 한다는 식의 표준화된 정의로 존재합니다.  

구현 - 각 JVM 벤더들(Oracle, IBM 등)은 표준화된 정의에 기반해 자신들의 JVM을 별도로 구현하여 사용합니다.

인스턴스 - JVM은 자바 바이트코드로 컴파일된 컴퓨터 프로그램을 실행하는 프로세스입니다.  

 

 

2) Java 프로그램의 수행 과정

 

(1) 자바 컴파일러가 자바 소스파일을 컴파일하여 자바 바이트코드(.class 파일)를 생성합니다.

(2) 클래스 로더가 .class 파일을 JVM 상으로 로딩시킵니다. 

(3) 실행 엔진이 로딩된 .class 파일을 해석합니다.

(4) Runtime Data Areas에 해석된 .class파일이 배치되어 실질적인 수행이 이루어집니다. 

 

 

3) JVM 구성 요소

 

(1) 클래스 로더

- JVM 내부로 .class 파일을 로딩하는 모듈입니다. 

- .class 파일을 적재함과 동시에 바이트코드가 올바르게 작성되었는지 검사합니다.   

 

(2) 실행 엔진

- 로딩된 .class 파일, 즉 바이트코드를 기계어로 변환하는 역할을 합니다. 

- 크게 인터프리터, JIT 컴파일러, 가비지 컬렉터로 구성됩니다.  

 

(2-1) 인터프리터

- 바이트 코드 명령어를 하나씩 읽어서 실행합니다. 

- 바이트 코드라는 언어는 기본적으로 인터프리터 방식으로 동작합니다.

- 하나 하나의 해석은 빠른 대신 인터프리팅 결과의 실행은 느리다는 단점을 갖고 있습니다. 

 

(2-2) JIT 컴파일러

- JIT 컴파일러는 인터프리터의 단점(성능, 속도 등)을 보완하기 위해서 도입되었습니다.

- 인터프리터 방식으로 실행하다가, 적절한 시점에 전체 바이트코드를 컴파일하여 네이티브 코드로 변환합니다. 

- 네이티브 코드를 실행하는 것이 하나씩 인터프리팅하는 것보다 빠르고, 

  캐시에 보관되므로 한 번 컴파일된 코드는 계속 빠르게 수행됩니다.  

 

(2-3) 가비지 컬렉터

- 가비지 컬렉션을 수행하는 모듈입니다. 

 

(3) Runtime Data Areas

 

(3-1) PC Register

- 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 생성됩니다.  

  현재 수행중인 JVM 명령의 주소값을 갖습니다. 

 

(3-2) JVM Stack

- 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 생성됩니다.  

  스택 프레임이라는 구조체를 통해, 

  메소드 내에서 사용되는 값들(매개변수, 지역변수, 리턴값 등)을 저장합니다. 

 

(3-3) Native Method Stack

- 자바 외의 다른 언어(C, C++ 등)로 작성된 코드를 위한 스택입니다. 

 

(3-4) Heap

- 인스턴스 또는 객체가 저장되는 공간으로, 모든 스레드가 공유합니다.  

  JVM의 성능과 가장 연관성이 높은 영역입니다.  

 

(3-5) Method Area

- 모든 스레드가 공유하는 영역으로, JVM이 시작될 때 생성됩니다. 

  JVM이 읽어들인 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 

  필드와 메서드 정보, Static 변수, 메서드의 바이트 코드 등을 보관합니다.  

 


요약

- JVM은 크게 클래스 로더, 실행 엔진, Runtime Data Area로 구성됩니다.

- 실행 엔진은 인터프리터, JIT 컴파일러, 가비지 컬렉터로 구성됩니다. 

- Runtime Data Area는 모든 스레드가 공유하는 영역과 각각의 스레드에 할당되는 영역으로 구분됩니다. 


레퍼런스

(도서)

- JVM Performance Optimizing 및 성능 분석 사례, 류길현, 오명훈, 한승민

(웹)

- Chapter 2. The Structure of the Java Virtual Machine (oracle.com)

- JVM Internal (naver.com)

- 자바 JVM 정리(Java Virtual Machine) :: JDM's Blog

- JVM | Yoon Sung's Blog (unluckyjung.github.io)

'Java' 카테고리의 다른 글

제네릭 프로그래밍  (0) 2022.05.20
Wrapper 클래스  (0) 2022.05.20
String 클래스  (0) 2022.05.20
equals()와 hashcode()  (0) 2022.05.20
비트 연산자  (0) 2022.05.20