JUST WRITE

JVM 본문

Programing/Java

JVM

천재보단범재 2021. 11. 27. 14:55
이 글은 Baeldung 사이트 'Difference Between JVM, JRE and JDK'를 해석, 정리한 글입니다.

 

JVM

JVM

Java Virtual Machine

JVM은 Java Program을 실행하기 위한 Virtual Machine이다.

  • JVM은 Bytecode를 해석한다.
  • Memory 영역에  Class 정보를 저장한다.
  • Java Compiler로 만들어진 Bytecode를 실행한다.
  • Class Loaders, Run-Time Data Areas, Execution Engine로 구성되어 있다.

출처 : https://inspirit941.tistory.com/296

Class Loaders

Class Loaders은 Bytecode를 로딩, 검증, 링크하는 과정을 진행한다.

Run-Time Data Areas

JVM은 Java Program을 실행하기 위해 다양한 Memory 영역을 정의한다.

JVM이 시작, 종료할 때나 Thread가 생성, 소멸될 때 생성, 소멸된다.

Method Area, Heap Area, Stack Area, PC Register, Native Method Stacks로 구성된다.

Method Area

Method Area은 컴파일된 코드의 저장소 영역과 비슷하다.

아래와 같은 정보를 저장한다.

  • Run-Time Constant Pool
  • Field, Method Data
  • Method, 생성자 코드

그리고 Method Area는 Permanent Generation Space(PermGen)으로 알려져 있다.

JVM이 시작할 때 생성되며 JVM Thread 모두 Method Area를 공유한다.

Heap Area

JVM은 Heap Area에 모든 Class 객체와 배열을 할당한다.

Garbage Collector(GC)가 Heap Area에 있는 객체를 회수한다.

GC가 회수하는 3가지 단계가 있다.

  • Eden Space
    • Young Generation 공간의 일부분
    • 객체가 생성되면 JVM은 이 영역에 생성된 객체를 할당
  • Survivor Space
    • Young Generation 공간의 또 다른 부분
    • Minor GC에서 살아남은 객체가 존재
  • Tenured Space 
    • Old Generation
    • 오래 살아 남은 객체가 존재
    • 임계값이 있어 Young Generation에 있는 객체의 임계값이 도달하면 객체는 이 영역으로 이동

JVM이 시작할때 생성되며 JVM Thread 모두 Heap Area를 공유한다.

Stack Area

로컬 변수, 중간 결과값, 내부 Method Call을 저장하는 Frame을 저장한다.

새로운 Thread가 생성될 때마다 하나의 Frame이 생성된다.

Thread는 자신의 Frame을 공유하지 않는다.

Frame의 구성요소는 아래 3가지로 구성한다.

  • Local Variable Array -> 모든 로컬 변수와 Method Parameter 저장
  • Operand Stack -> 중간 계산 값을 저장하는 공간
  • Frame Data -> 부분 결과값, Method Return 값, Exception Table 참조값

PC Register

Thread는 각각 PC Register를 가진다.

PC Register는 현재 어떤 명령을 실행하고 있는지 주소를 저장한다.

실행 중인 명령이 Native Method일 경우 정의되지 않는다.

Native Method Stacks

Native Method는 Java 이외의 언어로 쓰인 Method이다.

JVM은 Native Method를 호출할 수 있는 기능을 제공한다.

Native Method StacksNative Method 정보를 저장하며, "C stacks"로도 알려져 있다.

Thread가 생성될 때 Thread마다 Stack이 생성되며 각 Thread는 Stack를 공유하지 않는다.

Excecution Engine

Execution Engine은 현재 Memory 영역에 있는 명령을 실행한다.

Interpreter, JIT Compiler, Garbage Collector로 구성된다.

Interpreter

ClassLoader에서 Bytecode를 로딩, 검증하면 Intepreter는 Bytecode를 한 줄씩 실행한다.

이 과정이 매우 느리며, Method를 호출할 때마다 새로운 해석이 필요하다.

이러한 Inteprter의 단점을 극복하기 위해 JIT Compiler를 이용한다.

JIT Compiler

Just-In-Time Compiler

JIT Compiler는 Run-Time에 자주 호출되는 Method Byte code를 compile 한다.

JVM이 모니터링하고 있다가 JIT compile이 가능한 Method를 발견하면 기계어로 compile 하도록 예약한다.

이러한 compile 작업은 별도의 JVM Thread로 진행된다.

이 compile 작업으로 Java Program이 중단되지 않고 빨라집니다.

Garbage Collector

Java는 Garbage Collection으로 Memory를 관리한다.

Heap Area에서 진행하며 사용 중인 개체와 그렇지 않은 개체를 분리해서 사용하지 않는 객체를 제거한다.

Garbage Collection은 Daemon Thread로 진행된다.

System.gc() Method로 직접 실행할 수 있으며, 즉시 실행되지는 않는다.

Java Native Interface

JNI는 Java Code와 C, C++과 같은 Native Library들과의 Interface이다.

Application이 Java로만 안될 수 있는 상황이 있다.

이때, JNI를 사용하여 Native Library를 JVM으로 호출할 수 있다.

Native Libraries

플랫폼별 Native Method들의 구현체들로 구성하고 있다.

728x90
반응형

'Programing > Java' 카테고리의 다른 글

Utility Class  (0) 2021.12.31
JRE  (0) 2021.11.28
Serialization  (0) 2021.11.20
Optional  (0) 2021.10.31
Log4j vs Logback  (0) 2021.10.26
Comments