본문 바로가기
🗂 Study/자바

[Java] JVM의 구조와 Java의 실행방식

by 뿌맘 2021. 6. 15.
반응형

Java 프로그램 실행과정

 

1. 프로그램이 실행되면 JVM(Java Virtual Machine : 자바가상머신) OS로부터 이 프로그램이 필요로 하는 메모리를 할당받는다.

2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.

3. JVM Class Loader를 통해 class파일들을 로딩한다.

4. 로딩된 class파일들은 JVM의 Execution engine을 통해 해석된다.

5. 해석된 바이트코드는 Runtime Data Area 에 배치되어 실질적인 수행이 이루어지게 된다. 

, JVM main 메소드를 찾아 한줄한줄씩 읽어나가며 method area, heap area, stack area 등에 셋팅한다.

이러한 실행과정 속에서 JVM은 필요에 따라 Thread Synchronization GC같은 관리작업을 수행한다.


1. JVM

JVM이란?
Java Virtual Machine의 약자로, 자바 가상 머신이라고 불리며, 자바 바이트코드를 실행할 수 있는 주체이다.
자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된대로 자바 바이트 코드를 실행한다.
또한, 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작한다.

2.  JVM은 무엇으로 구성되어 있을까?

JVM은 크게 Class Loader, Execution Engine, Garvage Collector, Runtime Data Area로 구성되어 있다.

 

1) Class Loader

JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈.

런타임시에 동적으로 클래스를 로드한다.

.java 소스를 자바컴파일러(javac)가 컴파일하여 .class같은 클래스 파일(바이트코드)로 변환해준다.
Class Loader는 이러한 class파일들을 모아서 JVM이 운영체로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할을 한다.

 

2) Execution Engine

Class Loader를 통해 JVM 내의 Runtime Data Area에 배치된 바이트코드들을 명령어 단위로 읽어서 실행한다.

JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행한다.

인터프리터 방식 : 명령어를 하나씩 수행 (기본적인 방식. 전체 수행은 느리나 명령어 하나씩의 동작은 빠르다.)
JIT(Just In Time Compiler) 방식 : 전체 바이트 코드를 네이티브 코드로 변환하고 그 이후에는 인터프리팅하지 않고 네이티브 코드 상태로 실행 (전체적인 동작은 빠르나 컴파일하는데 상당 시간 소요)

 

3) Garvage Collector

Garvage Collector(GC)는 Heap 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들은 탐색 후 제거하는 역할을 한다. 

GC를 수행하는 동안 GC Thread를 제외한 다른 모든 Thread는 일시정지상태가 된다.
특히 Full GC가 일어나서 수초간 모든 Thread가 정지한다면 심각한 장애로 이어질 수 있다.

 

4) Runtime Data Area

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.

이 영역은 크게 Method Area, Heap Area, Stact Area, PC Register, Native Method Stack으로 나뉜다.

Method Area(메소드 영역)
모든 Thread가 공유하는 메모리 영역.
필드 정보(클래스 멤버 변수명, 데이터 타입, 접근 제어자 정보)
메소드 정보(메소드명, 리턴 타입, 접근 제어자 정보)
Type 정보(Interface인지 Class인지)
Constant Pool(상수 풀: 문자 상수, 타입, 필드, 객체 참조 저장)
static 변수
final 클래스 변수
Heap Area
모든 Thread가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역.
Method Area에 로드된 class만 생성 가능하며 GC가 참조되지 않은 메모리를 확인하고 제거하는 영역
Stack Area
모든 Thread가 공유하는 영역.
지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시값등이 생성되는 영역
int a = 10 을 예로 들면 정수값이 할당될 수 있는 메모리 공간을 a라고 잡아두고 그 메모리 영역에 10을 넣는다.
클래스 A a = new A()의 경우 A a는 스택영역에 저장되고 new로 생성된 A클래스의 인스턴스는 Heap영역에 생성된다.
또한 스택영역에 생성된 a는 힙영역의 주소값을 가지고 있다. 즉 a가 heap영역에 생성된 객체를 가리키며 참조하고 있다.
메소드 호출시마다 개별적으로 스택이 생성된다.
PC Register
Thread가 시작될 때마다 생성되는 영역으로, 생성될 때마다 생성되는 공간으로 Thread마다 하나씩 존재한다.
Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역.
이것을 이용해 쓰레드를 돌아가면서 수행한다.
Native method stack
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역.

 

 

참고블로그

반응형

댓글