본문 바로가기
코딩일기/Java

[Java] JVM 구조 및 작동 원리

by 욱파이어니어 2022. 10. 14.
728x90
반응형

JVM은 ByteCode를 읽어 들여와서 이해한후 컴퓨터 실행하는 역할을 한다.

 

JVM은 단순하게 JVM으로 구성된것이 아니라 안에 여러 개념들이 합쳐져 있는 상황에서 

ByteCode를 읽어들이고 그에 맞는 실행을 하게 된다.

 

 

 

 

그럼 이제 JVM에 대해 자세히 알아보자.

 

JVM의 구조는 크게 아래와 같다.

 

 

JVM 구조

 

위사진을 토대로 자세히 살펴보자.

JVM은 읽어 들인 ByteCode를 ClassLoader가 받아온다.

ClassLoader에서는 읽어들인 ByteCode에서 사용하는 Class에 대한 메모리들을 생성하고 ByteCode를 Runtime Data Area 적절한 장소에 배치 시킨다.

(Class Loader에 대해서 자세히 알고싶다면 아래 링크를 통해 확인해보면 된다.)

https://wpioneer.tistory.com/255

 

[Java] ClassLoader 구조 및 동작 원리

이전에 JVM에 대해서 자세히 설명한적이 있다 거기서 ClassLoader라는 개념이 나오는데 이번에는 ClassLoader에 대한 자세한 설명을 하려고 한다. Class Loader Class Loader는 ByteCode를 읽어서 Class 객체를 생..

wpioneer.tistory.com

 

 

그럼 Runtime Data Area에 대해서 자세히 알아보자.

 

 

Runtime Data Area는 아래 사진과 같이 5가지로 구분된다.

 

 

 

PC Register, JVM stack, Native Method stack은 Thread별로 따로 생성이 되고

Heap과 Method Area는 모든 Thread가 공유한다.

 

그럼 이제 각각에 대해서 자세히 알아보자.

 

 

 

PC Register

현재 수행중인 JVM Instruction(작업)의 주소를 가진다.

 

 

JVM stack

Thread의 Method가 호출 될때 수행정보(메소드 호출 주소, 매개변수, 지역변수, 연산 스택 등등)가 Frame이라는 단위로 

stack에 저장된다. 그리고 Method 호출이 종료될때 stack에서 제거된다.

 

 

 

Native Method stack

Java 외의 언어로 작성된 네이티브 코드를 위한 stack

(C/C++ 등의 코드)

 

 

 

Heap

인스턴스와 배열이 동적으로 생성되는 공간.

그리고 Garbage Collector의 대상이 되는 영역이다.

이부분은 모든 Thread가 공유되는 공간이기 때문에 동기화 문제가 발생할수가 있다.

 

 

 

 

Method Area

ClassLoader가 적재한 클래스에 대한 메타 데이터 정보가 저장 된다.

ex) class 정보, static 변수, 변수 정보가 들어가 있다.

 

이 영역에 등록된 Class만이 Heap에 생성될수 있다.

 

 

 

 

이렇게

ClassLoader 에서 Runtime Data Area에서 메모리 할당이 완료가 된다면 그 다음에 Execution Engine 에서 코드들을 실행을 하게 된다.

 

 

 

Execution Engine은 3가지 구성으로 구성되어 있다.

 

1. Interpreter

2. JIT

3. Garbage Collector

 

 

Interpreter와 JIT는 ClassLoader가 배치한 ByteCode를 실행시키는 역할을 하고 Garbage Collector는 

Runtime Data Area Heap 영역의 더 이상 참조되지 않는 객체를 정리한다.

 

 

일단은 코드를 실행하는 Interpreter와 JIT에 대해서 먼저 알아보자.

 

 

코드를 실행하게 되면 이제 기계가 실행할수 있는 언어로 변환이 되는데 이때 2가지 방식을 사용 한다.

 

1. Interpreter

바이트코드를 명령어 단위로 한줄 한줄 해석한다. 따라서 느리다는 단점이 있다.

 

 

 

2. JIT (Just In Time)

Interpreter의 단점을 보완하여 등장한것이 JIT 컴파일러다.

한번 컴파일 된 경우에는 캐시에 보관되기 때문에 빠르게 수행하나 아닌경우에는 Interpreter의 방식보다 오래걸린다.

이때문에 내부적으로 해당 메소드가 얼마나 자주 수행되는지 확인하여 적절히 두방법을 섞어 수행하게 된다.

 

이렇게 실행을 하게 되면 

 

 

이렇게 코드를 실행하다가 Runtime Data Area Heap 영역에서 더이상 사용하지 않는 것들은 이제 Garbage Collector가 

수거해서 없애줘 메모리를 관리한다.

 

 

 

 

 

이렇게 우리가 작성한 코드가 JVM은 우리의 코드를 통해 적절하게 메모리를 할당해주고 그 메모리에 할당된 코드를 실행시켜서 기계에게 작업을 수행시켜준다.

 

 

반응형