Back-end/Java Language

JVM(Java Virtual Machine)?

prden 2021. 6. 4. 08:53

1. JVM이란?

src=https://namu.wiki/w/%EC%9E%90%EB%B0%94%20%EA%B0%80%EC%83%81%20%EB%A8%B8%EC%8B%A0

JVM이란 Java Byte Code를 OS에 맞게 해석해주는 역할을 한다.(가상 머신이란 프로그램을 실행하기 위해 물리적인 머신과 유사한 머신을 소프트 웨어로 구현한 것을 뜻한다.)

jvm의 역할은 java와 os사이에 중개자 역할을 수행하여 java가 os에 구애받지 않고 재사용을 가능하게 해 준다. 그리고 메모리 관리를 수행한다. 또한, jvm은 스택 기반의 가상 머신이다. (ARM 아키텍처 같은 하드웨어는 레지스터 기반)

 

<위 그림 설명>

1. Java compiler(javac)는. java 파일을. class라는 Java byte code로 변환시켜준다. ByteCode는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는다. 이를 위해 JVM은 OS가 ByteCode를 이해할 수 있도록 해석해 준다. (ByteCode는 JVM위에서 OS에 상관없이 실행)

2. 하지만 JVM의 해석을 거치기 때문에 C언어보다 속도가 느렸지만 JIT 컴파일러를 구현해 이 점을 보완했다. 

3. JVM은 크게 3가지 ClassLoader, Runtime Data Areas, Excution Engine로 구성되어있다. 

 

2. JVM 구조

1) ClassLoader :

 RunTime 시점에 클래스를 로딩하게 해 주며 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 업로드하게 된다. 

다시말해 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크한다.

 

2) Runtime Data Areas : https://asfirstalways.tistory.com/158 (runtimedataarea)수정

JVM이 프로그램을 수행하기 위해 OS로부터 별도로 할당받은 메모리 공간을 말하며, Runtime Data Areas는 크게 5가지 영역으로 나눌 수 있다. 

 2-1) Heap :

 프로그램 상에서 런타임 시 동적으로 할당하여 사용하는 영역으로. class를 이용해 instance를 생성하면 Heap에 저장된다.  ex) ClassA a = new ClassA();

 2-2) Method Area : 

 모든 스레드가 공유하는 메모리 영역으로 Method Area는 클래스, 인터페이스, 메서드, 필드 static 변수 등의 바이트 코드 등을 보관한다. 

2-3 ~ 2-5) PC Register, JavaVirtualMachineStack, Native Method Stack

 

3.) Excution Engine

Load 된 Class의 ByteCode를 실행하는 Runtime Module이 바로 ExcutionEngine이다. 

JVM내의 Runtime Data Areas에 배치된 바이트 코드는 ExcutionEngine에 의해 실행되며, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다. 

 

3-1) Interpreter:

 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다. 하지만, 이 방식은 한 줄씩 수행하기 때문에 느리며 인터프리터 언어의 단점을 그대로 갖고 있다. 

3-2) Jit compiler:

 인터프리터 방식의 단점을 보완하기 위해 도입된 것이 Jit 컴파일러다. 인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고, 이후에는 더 이상 인터 프리팅 하지 않고 네이티브 코드로 직접 실행하는 방식이다. 네이티브 코드는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 빠르게 수행하게 된다. 

3-3) GarbageCollector