DevBoi

[Java] JVM 동작 과정 본문

Language/[Java]

[Java] JVM 동작 과정

HiSmith 2022. 2. 18. 18:51
반응형

JVM

C/C++은 컴파일 플랫폼과 타겟 플랫폼이 다를 경우 프로그램이 동작하지 않는다.

 

크로스 컴파일 : 타겟 플랫폼에 맞춰서 컴파일을 하는 것이다.

JVM은 java 소스를 컴파일 하면, 자바 바이트코드로 만들어준다. 자바 바이트코드는 Jvm이 설치된 플랫폼이면 다 정상 작동한다.

 

Java 프로그램 동작과정

1. 프로그램이 실행되면, JVM은 OS로 부터 이 프로그램이 필요한 메모리를 할당 받는다.

2.자바 컴파일러가 자바 소스코드를 읽어, 해당 소스코드를 자바 바이트 코드로 컴파일한다.

3.Class Loader가 동적로딩을 통해 class파일들을 동적 로딩 및 링크하여 런타임 데이터 영역, JVM메모리 영역에 올린다.

4.Execution Engine이 메모리에 올라간 class들을 기계어로 변경해 명령어 단위로 실행한다.

5.실행과정 속에 JVM은 GC작업 등을 실행한다.

 

 

 

 

JVM은 크게 GC,Execution Engine,Class Loader,Runtime Data Area로 나뉜다.

 

1) Class Loader

클래스 로더는 실행을 위해 자바 바이트코드를 로드하고 검증한다. 검증후에 자바 바이트 코드를 위해 메모리를 할당한다.

Runtime시점에 자바 바이트 코드를 읽어서 Runtime Data area에 적재한다.

 

Runtime Data Area

-PC register : 현재 실행중인 명령어의 주소를 가지고 있는 곳

- Stack Area : 메소드 호출과 로컬 변수가 저장되는 메모리

- Native Method Stack : 자바외의 언어로 작성된 네이티브 코드를 위한 영역

- Heap : 프로그램 상으로 런타임 시에 동적으로 할당하여 사용되는 영역 (GC대상)

- Method Area : 클래스 이름 부모 클래스 정적 변수에 대한 정보를 바이트 코드 영역으로 보관하는 영역

 

모든 쓰레드는 Stack , Native Method, Stack, Pc register 에 대한 고유한 값을 가지고 있지만

Method Area와 heap은 모든 쓰레드가 서로 공유한다.

 

 

2)Execution Engine

클래스 로더를 통해 로드된 자바 바이트 코드들을 기계어로 변경해 명령어 단위로 실행하는 역할을 한다.

내부에는 Interpreter, Jit complier, Garbage Collector가 존재한다.

이중 기계어로 변경하는 작업을 하는 부분은 InterPreter,Jit complier이다.

 

1) Interpreter

인터프리터 엔진은 자바 바이트 코드를 명령어 단위로 한줄씩 읽어서 실행한다.

2)Jit complier (Just in time Compiler)

적절한 바이트 코드를 기계어로 변경, 엔진이 기계어로 컴파일된 코드를 실행하도록 도와준다.

(한번 혹은 자주사용된 코드를 기계어로 변경한다.)

자주 사용하거나 한번이라도 사용된 코드를 기계어로 가지고있고, 해당 기계어를 엔진이 실행할수 있도록 도와준다.

 

Jit 컴파일러 방식은 인터프리터 보다 속도는 빠르지만 오버헤드를 야기할수있다,

그래서 해당 JVM에서는 초반에는 인터프리터 방식으로 동작되지만, 일정 시점이후에는 Jit Complier 방식으로 진행이 된다.

그래서 자바 초반보다 중후반에 사용하는 경우 속도가 더 빠른것을 느끼는 경우가있다(JIT 컴파일러를 통해, 자바 바이트 코드를 미리 기계어로 가지고 엔진이 해당 기계어로 실행 될수 있게끔 도와주기 때문이다.)

 

 

 

 

 

 

 

반응형

'Language > [Java]' 카테고리의 다른 글

[Java] Primitive Type, Wrapper Class  (0) 2022.02.20
[Java] Java heap_memory 에 대해서  (0) 2022.02.19
[JAVA] 스택 & 힙 & Garbage Collector  (0) 2022.02.18
[Java] 제네릭의 이해  (0) 2022.02.17
Java 리플렉션 이란?  (0) 2021.12.06