티스토리 뷰

JAVA/JAVA기본

JAVA - JVM이란 무엇인가

realizers 2021. 11. 27. 21:43
728x90
반응형

JVM이란?

  • JVM이란 Java Virtual Machine의 약자로 자바를 실행하기 위한 가상 기계라고 할 수 있습니다.
  • 자바로 작성된 애플리케이션은 모두 JVM에서만 실행되기 때문에 자바 애플리케이션을 실행하기 위해서는 반드시 JVM이 필요합니다.
  • Java Compiler는 JVM이 인식할 수 있도록 .java 파일을 .class라는 'Java Byte Code'로 변환 시켜줍니다.
    • 💡 여기서 Java Compiler는 JDK를 설치하면 bin 폴더에 있는 javac.exe 파일을 말합니다. (즉 , JDK에 Java Compiler가 포함되어 있습니다.)
  • Java Compiler에 의해 변환된 Java Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행될 수 없습니다. 이때 JVM이 OS가 Java Byte Code를 이해할 수 있도록 해석을 해줍니다. 그렇기 때문에 Java Byte Code는 JVM 위에서 OS의 상관없이 어느곳에서나 실행될 수 있습니다.

 

컴파일 하는 방법

  • 아래의 예제는 Java Compiler에 의해 .java 파일을 .class 라는 Java Byte Code로 변환하는 과정입니다.
  • Java Compiler는 JDK를 설치하면 JDK의 bin 폴더 내부에 javac.exe라는 실행파일로 존재합니다.
  • Java Compiler의 javac 명령어를 통하여 .java 파일을 .class 파일로 생성할 수 있습니다.

Step 01 - 예제 파일 생성

public class Example {
    public static void main(String[] args)  {

        System.out.println("Hello World");
    }
}

 

Step 02 - 해당 디렉토리로 이동하여 javac 명령어 실행

C:\Users\해당 디렉토리>javac Example.java

 

 

실행하는 방법

  • java 명령어를 사용하여 .class 파일을 실행시킬 수 있습니다.
  • 💡 JDK 디렉토리의 bin 폴더에 java.exe라는 실행 파일이 있는데 해당 파일은 JVM을 실행시키기 위한 명령 프로그램입니다.
    • java 명령어로 JVM을 실행시킬 수 있습니다.
  • 저는 cmd에서 Error: Could not find or load main class (클래스 이름) 이라는 예외가 발생하여 패키지를 전체 묶어서 다시 진행 하였습니다.

바이트코드란 무엇인가

  • Java Byte Code란 JVM이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미합니다. 자바 컴파일러에 의해 변환된 코드의 명령어 크기가 1 byte라서 Java Byte Code라고 불리고 있습니다. 또한 이러한 자바 바이트 코드의 확장자는 .class입니다.
  • 위의 말을 쉽게 표현하자면 JVM이 자바 바이트 코드를 읽어서 컴퓨터가 이해할 수 있는 언어로 변환하는것이다.
  • Java Byte Code는 JVM이 설치되어 있으면 어떠한 운영체제에서라도 실행될 수 있습니다.

 

JIT 컴파일러란 무엇이며 어떻게 동작하는가

  • JVM에 Java Byte Code가 전달되면 JVM은 전달 받은 Byte Code를 실행하게 되는데 이때 바이트 코드를 실행하는 과정에서 JVM은 JIT 컴파일을 통해 바이트 코드를 기계어로 변환합니다.
  • 컴퓨터 프로그램을 만드는 방법은 크게 두가지로 나누어 살펴 볼 수 있는데 첫번째는 정적 컴파일 방식이고 두번째는 인터프리터 방식입니다.

 

Case 01 - 정적 컴파일 방식이란?

  • 대표적인 예인 C나 C++에서는 프로그램을 실행하기 전에 한번에 컴파일과정을 수행합니다.

Case 02 - 인터프리터 방식이란?

  • JavaScript 같은 인터프리터 언어들은 프로그램을 실행할 때 코드를 읽어가면서 그에 대응하는 기계어 코드를 생성합니다.

그래서?

  • 인터프리터 언어는 Runtime 상황에서는 인터프리터가 한 줄씩 읽고 실시간으로 실행하기 때문에 컴파일 언어에 비해 속도가 느립니다.
  • 컴파일 언어는 소스코드를 기계어로 변환하는 빌드 과정에서 인터프리터 언어에 비해 시간은 소요되지만 Runtime 상황에서는 이미 기계어로 변환되어 있기 때문에 빠르게 실행할 수 있습니다.

 

Case 03 - 그렇다면 JIT이란 무엇일까?

  • JIT 컴파일(Just-In-Time compilation)은 위의 두가지 방법을 혼합한 것으로 JIT 컴파일러는 바이트 코드를 읽어서 빠르게 기계어로 변환합니다.
  • JIT 컴파일러는 프로그램을 실행하는 과정에서 필요한 부분만 기계어로 변환하고, 기계어로 변환된 부분은 캐시에 저장해서 재사용시 컴파일을 다시 할 필요가 없게됩니다. 때문에 일반적인 인터프리터 방식보다 빠릅니다.

 

JVM의 구성 요소

JVM의 구성 요소를 크게 나누면 다음과 같은 요소로 구성됩니다.

 

클래스 로더(class loader)

  • Java 컴파일러가 .java 파일을 컴파일하면 .class파일이 생성이 되는데 이렇게 생성된 .class 파일을 엮어서
    Runtime Data Area 형태로 메모리에 적재하는 역할을 합니다.

실행 엔진(Execution Engine)

  • 클래스를 실행시키는 역할을 수행합니다.
  • 클래스 로더가 JVM내의 Runtime Data Area영역에 바이트 코드를 배치시키고 이것들은 실행 엔진에 의해 실행됩니다.
  • 자바 바이트 코드(.class)는 기계가 바로 수행할 수 있는 언어보다는 비교적 사람이 보기 편한 형태로 기술되어 있는데 그래서 실행 엔진은 이와 같은 바이트 코드를 JVM 내부에서 기계가 실행할 수 있는 형태로 변환합니다.

가비지 콜렉터(Garbage Collector)

  • Heap 메모리 영역에 생성된 객체들 중에 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제합니다.

 

JDK와 JRE의 차이

 JDK란? (Java Development Kit: 자바 개발 키드)

  • JDK는 개발을 위해 필요한 도구(javac, java 등)들을 포함하고 있습니다.
  • JDK는 JRE를 포함하고 있습니다.
  • 즉 JDK = JRE + @라고 생각할 수 있습니다.

JRE란? (Java Runtime Enviroment: 자바 런타임 환경)

  • JRE는 JVM이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있습니다.
  • JRE는 JVM의 실행환경을 구현했다고 할 수 있습니다.
  • 자바 프로그램을 실행시키기 위해서는 반드시 JRE가 필요합니다.

728x90
반응형