ZeroRadish

[Java] JVM (1) 본문

카테고리 없음

[Java] JVM (1)

ZeroRadish Etc 2022. 1. 30. 21:48

일반적인 언어는 CPU 아키텍쳐와 플랫폼의 환경에 맞추어 기계어로 컴파일 됩니다.
그렇기 때문에 플랫폼이 변경되는 경우,
타겟 플랫폼에 알맞게 크로스 컴파일을 해주지 않는다면 제대로 동작하지 않을 수 있습니다.





자바의 경우는 CPU의 아키텍쳐와 플랫폼의 환경에 맞추는 것이 아닌 바이트코드라는 것으로 컴파일 됩니다.
바이트 코드로 컴파일된 결과물이 .class 파일 입니다.
class 파일을 해석하고 실행하기 위해서는 반드시 자바 가상 머신 JVM이 필요합니다.
우리가 JDK 또는 JRE 를 설치하는 이유 입니다.




위 그림을 보면 JRE는 JVM을 포함하고 있고, JDK는 JRE를 포함하고 있습니다.

그렇기 때문에 Java 어플리케이션을 실행만 하기 위한 환경이라면 JDK를 설치할 필요는 없습니다. JVM을 포함하고 있는 JRE만 설치되어 있어도 문제 없이 실행 됩니다.




Eclipse, IntelliJ와 같은 개발도구에서 우리가 작성한 Java Source( .java) 파일을 실행을 하게 되면

  1. 프로그램이 실행되면 JVM은 OS로부터 실행한 필요한 메모리를 할당 받는다.
  2. JAVA Compiler(JAVAC)를 통해 자바 바이트코로 컴파일하여 class 파일을 생성한다.
  3. 물리적인 class 파일들은 Class Loader 통해 JVM메모리 영역의 Runtime Data Area로 로딩 된다.
  4. 로딩된 class파일들의 바이트코드는 Execution Engine에 의해 명령 단위로 해석 된다.
  5. 해석된 바이트코드는 Runtime Data Area 의 각 영역으로 배치되어 실질적인 수행이 이루어지게 된다.

 

ClassLoader

 

Java Compiler 를 통해서 .class 확장자를 가진 클래스 파일은 각 디렉터리에 흩어져 있습니다. 또한, 기본적인 라이브러리의 클래스 파일들은 $JAVAHOME_ 내부 경로에 존재합니다. 각각의 클래스 파일들을 찾아서 Runtime시에 동적으로 ByteCode를 JVM 의 메모리에 Load 역할을 하는 것이 바로 ClassLoader 의 역할입니다.

 


Execution Engine

 

Load된 Class의 ByteCode를 실행하는 Runtime Module이 바로 Execution Engine입니다. Class Loader를 통해 JVM 내의 Runtime Data Areas 에 배치된 바이트 코드는 Executin Engine에  기계어로 컴파일되어 실행되며, 기계어로 변경하는 방식은 Interpreter, JIT compiler 2가지 존재 합니다.

 


Runtime Data Area

 

프로그램이 실행되면서 JVM이 OS에게 할당받은 메모리 영역이 바로 Runtime Data Area. Runtime Data Area 는 크게 PC Register, Java Stacks, Native Method Stacks, Method Area, Heap 영역으로 나누어 집니다.  각 Thread 별로 생기는 영역은 PC Register, Java Stacks, Native Method Stacks 이고, 모든 Thread 가 공유하는 영역은 Method Area 와 Heap 입니다.

 



Comments