본문 바로가기
IT 개인 공부/Java

[Java] JVM(Java Virtual Machine)

by Libi 2021. 7. 11.
반응형

자바의 가장 큰 특징은 "Write Once, Run Everywhere!", 동일한 프로그램이 다양한 컴퓨터에서 실행이 가능하다는 점이다. 이를 가능하게 해주는 게 바로 JVM이다.

보통의 프로그래밍 언어의 경우 소스 코드가 컴파일러에 의하여 기계어로 변환되어 컴퓨터에서 실행되도록 한다. 하지만 자바 컴파일러는 특정한 컴퓨터를 위한 코드를 생성하는 대신 가상적인 기계를 위한 코드를 생성한다.

이 코드는 바이트 코드(Byte Code), 중간 코드라고 불리며 자바 가상 기계(JVM)에 의해 해석되어서 실행된다.

JVM이 바이트 코드를 해석한다는 것은 알겠다. 그렇다면 JVM의 구조는 어떤 식으로 이루어져 있으며 바이트 코드를 어떻게 해석하여 실행되도록 하는지 한 번 알아보자.

 

JVM의 구성은 크게 4가지(Class Loader, Execution, Garbage Collector, Runtime Data Area)로 나뉜다.

각각 무슨 역할을 하는지 한번 알아보자.

 

1. Class Loader

Class Loader, 이름만 봐도 클래스들을 어딘가에 적재하는 역할을 수행할 것 같은 친구이다.

자바에서 소소 코드를 작성하면 .java 파일이 생성된다. 이 파일을 java 컴파일러가 컴파일하면 .class 파일(바이트 코드)이 생성된다.

이렇게 생성된 .class 파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하도록 해주는 친구가 바로 Class Loader이다. (자바 애플리케이션이 실행 중일 때 이런 작업이 수행된다.)

2. Execution Engine

Class Loader에 의해 메모리에 적재된 .class 파일들을 기계어로 변경해 명령어 단위로 실행하는 역할을 하는 친구이다.

명령어 단위를 실행하는 방법은 하나씩 실행하는 인터프리터(Interpreter) 방식과 적절한 시간에 전체 .class 파일들을 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 JIT(Just-In-Time) 컴파일러를 이용하는 방식이 있다.

3. Garbage Collector

Garbage Collector는 한 번쯤은 들어봤을 것이다. 흔히 불필요한 메모리들을 관리해 주는 장치로 알고 있을 것이다. 정확하게는 Heap 메모리 영역에 생성된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할을 수행한다.

Garbage Collector가 역할을 하는 시간은 정확히 언제인지를 알 수 없다. 또 다른 특징은 Garbage Collector가 수행되는 동안 Garbage Collector를 수행하는 스레드가 아닌 다른 스레드들은 일시정지된다.

4. Runtime Data Area

Runtime Data Area, 이름 그대로 자바 프로그램을 실행할 때 사용되는 데이터들이 적재되는 메모리 영역이다. 크게 Method Area, Heap Area, Stack Area, PC register, Native Method Stack, 5가지 영역으로 나눌 수 있다.

 

스레드가 생성되었을 때 기준으로 메서드 영역, 힙 영역은 모든 스레드가 공유하고, 스택 영역, PC 레지스터, Native Method Stack은 각각의 스레드마다 생성되고 공유되지 않는다.

 

 

 

[ Reference ]

· https://jeong-pro.tistory.com/148

반응형

댓글