본문 바로가기
Programming Language/JAVA

JVM (Java Virtual Machine ) 이란?

by Ray 2022. 1. 17.

JVM이란?

JVM은 Java Virtual Machine 의 약자로 자바 가상 머신입니다.

Java로 작성된 애플리케이션은 JVM에서만 실행됩니다.

JVM은 Java 바이트코드를 읽고 이를 OS에 맞게 해석하여 실행할 수 있도록 하는 역할을 수행합니다.

이렇게 JVM이 OS과 Java 애프릴케이션 사이에서 역할을 수행하기 때문에

  • Java 애플리케이션은 OS에 독립적으로 실행될 수 있습니다.
  • Java 코드의 변경없이, 다양한 OS에서 실행할 수 있습니다.

또한 Garbage Collection을 이용해서, 메모리를 효율적으로 관리해 줍니다.

 

JVM의 역할

  1. Java 바이트 코드를 OS에 맞게 해석하여 실행
  2. Garbage Collection을 이용해 메모리를 효율적으로 관리

 

Java 바이트 코드

  • Java 바이트 코드는 JVM이 이해할 수 있는 언어로 변환된 Java 소스 코드 입니다.
  • Java 컴파일러에 의해서 변환되며 .class 확장자를 가집니다.
  • 코드의 명령어 크기가 1 Byte라서 바이트 코드라고 불립니다.

JVM의 구성요소

JVM은 크게 Class Loader / Runtime Date Area / Execution Engine 로 구성됩니다

 

- Class Loader : 

    Java 컴파일러가 생성한 .class 파일들을 JVM으로 읽어오고, 이를 메모리에 적재하는 역할을 합니다.

 

- Runtime Data Area : 

    프로그램의 실행을 위해, OS로부터 할당받은 메모리 공간입니다.

    Method Area / Heap Area / Stack Area / PC Register / Native Method Stack으로 구성되어 있습니다.

  • Method Area : static area로 class 정보를 처음 메모리에 적재할 때, 초기화되는 대상을 저장하는 공간
  • Heap Area : new 연산자로 생성된 객체와 배열이 저장되는 공간
  • Stack Area : 소멸될 정보(변수, 임시 데이터, 메소드 매개변수, 리턴값)를 임시로 저장하는 공간
  • PC Register : 스레드가 생성될 때마다 생성되어, 현재 수행중인 JVM 명령의 주소값을 갖는 공간
  • Native Method Stack : Java 코드가 아닌, Native 언어(C언어)를 실행시키는 공간

 

- Execution Engine : 

    Runtime Data Area 에 적재된 바이트 코드를 실행하는 역할을 합니다.

    Interpreter / JIT Compiler / Garbage Collector 로 구성되어 있습니다.

  • Interpreter :  바이트 코드를 Native 코드로 변환하는 역할. 한줄씩 컴파일하여 변환
  • JIT(Just In Time) Compiler : Interpreter의 효율을 높이기 위한 역할. 반복되는 코드를 발견하면 캐싱하여 변환
  • Garbage Collector : Runtime Data Area의 Heap Area 에 있는 더 이상 참조되지 않은 객체를 정리

Java 코드의 실행 과정

  1. Java 컴파일러가 Java 코드(.java)를 Java 바이트 코드(.class)로 컴파일
  2. 변환된 Java 바이트 코드(.class)를 JVM의 Class Loader에게 전달
  3. Class Loader는 Java 바이트 코드(.class)를 JVM 메모리에 로드
  4. Execution Engine은 JVM 메모리에 적재된 바이트 코드를 명령어 단위로 가져와서 실행
  5. JVM은 필요에 따라서 쓰레드 동기화 / GC 등 관리 작업을 수행 

JVM의 특징

  • 스택 기반의 가상 머신
  • 심볼릭 레퍼런스 : 기본형 타입을 제외한 모든 타입을 심볼릭 레퍼런스를 통해 참조
  • Garbage Collection : 객체들은 사용자 코드에 의해 생성되고 Garbage Collection에 의해 파괴
  • 기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장
  • Network Byte Order