🌜 Programming/JAVA

JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

728x90

안녕하세요. 그린주입니다 ๑'ٮ'๑

 

목표

자바 소스 파일(. java)을 JVM으로 실행하는 과정 이해하기.


학습할 것

JVM 설명

Compiler

바이트코드

JIT 컴파일러

JDK와 JRE의 차이


JVM 설명

1. JVM(Java Virtual Machine)이란 무엇인가?

출처 : https://velog.io/@pearl0725/JVM은-어떤-역할을-할까

JVM는 JAVA를 어디에서나 실행 가능하게 해주는 가상 머신입니다.

 

JAVA는 운영체제(OS)에 종속적이지 않다는 특징을 가지고 있습니다. 운영체제에 종속받지 않고 실행되기 위해서는 운영체제에서 JAVA를 실행시킬 무언가가 필요합니다. 그게 바로 JVM입니다.

 

2. JVM 구성 요소

 

  클래스 로더(Class Loader)

 

자바 컴파일러에 의해 바이트코드로 변환된 클래스를 읽어 들여 Runtime Data Area에 적재하는 역할을 합니다.

 

 

  실행 엔진(Execution Engine)

 

Class Loader에 의해 Runtime Data Area에 적재된 클래스(바이트코드)를 기계어로 변환하고 실행하는 역할을 합니다.

명령어는 Interpreter 방식으로 하나하나 실행되기도 하고, JIT(Just-In-Time)에 의해 적절한 시간에 전체 바이트코드를 네이티브 코드로 변환하여 실행되기도 합니다.

 

 

  가비지 컬렉터(Garbage Collector)

 

Garbage Collector(GC)는 Heap영역에 생성되어 있는 객체들 중 참조되지 않는 객체를 찾아 제거하는 역할을 합니다.

GC가 실행되는 시간은 정해져 있지 않습니다. 특히 Full GC가 발생하는 경우, GC를 제외한 모든 스레드가 중지되기 때문에 장애가 발생할 수 있습니다.

 

 

  런타임 데이터 영역(Runtime Data Area)

 

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다.


컴파일(Compile)

. java(소스코드) 파일을 javac명령어를 사용하여. class(바이트코드) 파일로 변환하는 프로세스입니다.

 

1. 컴파일하는 방법

1. "Hello Java!"를 출력하는 Hello.java 파일을 생성합니다.

// Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}

 

2. cmd창에서 Hello.java 파일이 있는 폴더로 이동합니다.

>cd [파일위치]
// 예시
>cd Desktop

 

3. 해당 위치에서 javac 명령어로. java을. class로 컴파일합니다.

>javac [파일명.java]
// 예시
>javac Hello.java

 

4. Hello.class파일이 있는지 확인합니다.

>dir
/*
2022-02-18  오전 10:11               41* Hello.class
2022-02-18  오전 09:54               13* Hello.java
2022-01-25  오후 05:23    <DIR>          helloSpring
*/

2. 컴파일 버전 허용 옵션

  -source <release>  소스 호환성을 제공  Provide source compatibility with specified release
  -target <release>  특정 VM 버전에 대한 클래스 파일 생성  Generate class files for specific VM version
javac [option] [파일명.java]
// 예시 1.8 버전 허용
javac -source 1.8 -target 1.8 Hello.java

3. 실행하는 방법

java 명령어로 JVM을 구동시켜. class파일을 실행합니다.

 

1. cmd창에서 Hello.class파일이 있는 폴더로 이동합니다.

>cd [파일위치]
// 예시
>cd Desktop

 

3. 해당 위치에서 java 명령어로 Hello.class를 실행시켜줍니다. 이때 확장자를 뺀 파일명만 입력합니다.

>java [파일명]
// 예시
>java Hello

 

4. "Hello, Java!"가 출력되는지 확인합니다.

 

결과 1) 오류가 발생했습니다. 컴파일은 java11로 했는데 실행은 java8로했기때문에 나타나는 오류입니다.

  컴파일(상위 버전)-실행(하위 버전) X / 컴파일(하위 버전)-실행(상위 버전) O

java.lang.UnsupportedClassVersionError: 
Hello has been compiled by a more recent version of the Java Runtime (class file version 55.0), 
this version of the Java Runtime only recognizes class file versions up to 52.0

// javac 버전과 java 버전을 확인
// javac 버전
>javac -version
javac 11.0.14

// java 버전
>java -version
java version "1.8.0_291"

방법 1) java8(하위 버전)로 실행하는 방법

- Hello.class 파일을 지우고 옵션을 주어 java8에서 실행할 수 있도록 합니다.

- Hello.class 파일을 지우고 java8로 컴파일 후 실행합니다.

 

방법 2) java11(상위 버전)로 실행하는 방법

- java11로 Hello.class를 실행합니다.


결과 2) "Hello, Java!"가 출력되어 Hello.class파일이 실행된 걸 확인할 수 있습니다.

>java Hello
Hello, Java!

바이트코드

자바 소스코드를 컴파일한 결과물이며, 확장자는 .class으로 클래스 파일이라고도 합니다.

 

특정 운영체제가 이해할 수 있는 기계어가 아니며, JVM이 이해할 수 있는 명령어입니다.

JVM이 설치되어 있지 않다면 실행할 수 없다는 단점이 있습니다.


JIT(Just In Time) 컴파일

JIT는 Just-In-Time의 약자로 JIT 컴파일러는 JVM의 Execution Engine 파트에 속해있습니다. 

바이트코드를 컴퓨터 프로세서(CPU)로 직접 보낼 수 있는 명령어로 바꾸는 프로그램입니다.

 

JIT 컴파일러는 같은 코드를 매번 해석하는 것이 아닌, 실행할 때에 컴파일을 하면서 해당 코드를 캐싱한다는 장점이 있습니다. 이후에는 변경이 된 부분만 컴파일을 하고, 나머지는 캐싱된 코드를 사용합니다


JDK와 JRE 차이


  JDK(Java Development Kit)

 

자바 개발도구로 Java를 사용하기 위해 필요한 모든 기능을 갖춘 JAVA용 SDK입니다. JRE + Development Kit를 포함해 프로그램을 생성하고 컴파일할 수 있습니다.

 

 

  JRE(Java Runtime Environment)

 

자바 런타임 환경으로 JVM(자바 가상 머신) + Library(자바 클래스 라이브러리)를 포함한 컴파일된 JAVA 프로그램을 실행하는데 필요한 패키지입니다.


마무리

 

긴 글 봐주셔서 감사합니다!
오늘도 행복한 하루 보내세요 '◡'✿


참고

JVM은 어떤 역할을 할까?

자바의 구동 원리와 JVM(Java Virtual Machine)

[JAVA] JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...)

JIT 컴파일러(Compiler)에 대해 알아본다.


728x90
728x90