Java

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

개발하는 까꿍이 2021. 8. 22. 23:58

WHITESHIP JAVA LIVE STUDY

목표

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

JVM이란 무엇인가

Java Virtual Machine의 줄임말로 '자바를 실행하기 위한 가상 기계(컴퓨터)'라고 할 수 있다.

 

기존의 언어는 한 운영체제에 맞게 개발된 프로그램을 다른 종류의 운영체제에 적용하기 위해 많은 노력을 기울였지만 자바는 운영체제의 종류와 상관없이 실행할 수 있다. 그 이유는 자바가상머신(JVM)이다.

 

자바 응용프로그램은 운영체제나 하드웨어가 아닌 JVM하고만 통신하고 JVM이 자바 프로그램으로부터 전달받은 명령을 해당 운영체제가 이해할 수 있도록 변환하여 전달한다. 자바 애플리케이션은 JVM을 한번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 해석되기 때문에 속도가 느리다는 단점이 있다.

Java애플리케이션과 일반 애플리케이션의 비교

 

JRE와 JDK

JRE와 JDK의 차이점을 알기 전에 각 개념에 대해 간단히 알아보자.

JRE(Java Runtime Environment)

JVM + 자바 클래스 라이브러리

JRE는 자바실행환경으로 JVM과 클래스 라이브러리(Java API)를 포함하고 있다. 클래스 라이브러리로 인해 자바로 개발된 class를 실행 및 운영할 수 있으며 JVM로 인해 자바로 작성된 응용프로그램이 실행되기 위한 최소 환경을 만들 수 있다.

 

JDK(Java Development Kit)

JRE + 개발에 필요한 실행파일

JDK는 자바개발도구로 JRE와 개발에 필요한 실행파일(javac.exe 등)을 포함하고 있다.

그러므로 JDK를 설치하면 JVM과 자바 클래스 라이브러리가 함께 설치되고 그 외에 자바를 개발하는데 필요한 프로그램들이 설치된다. (실행파일은 JDK의 bin디렉터리에 저장된다.)

 

JRE와 JDK의 차이

JRE JDK
- 자바 언어로 작성된 프로그램을 실행
- 운영할 수 있는 환경
- 자바 언어로 프로그램을 개발하기 위해서 설치
- 개발에 필요한 환경
- JRE가 포함되어 설치

 

컴파일하는 방법

javac는 자바 컴파일러로 javac를 사용하여 컴파일해준다. cmd창에서 javac 파일명.java를 실행하면 컴파일이 된다.

컴파일하면 해당 파일이 .java파일에서 .class파일로 변환된 것을 확인할 수 있다.

💡 컴파일러 : 고급언어를 기계어로 바꿔주는 것으로 번역기의 역할과 동일하다.

 

실행하는 방법

1. 프로그램 실행

2. JVM이 OS로 부터 메모리를 할당받고, 용도에 따라 나누어 관리

3. 자바 컴파일러(javac)가 소스 코드(.java)를 읽어 바이트 코드로 변환(.class)

4. JVM의 Class Loader가 변환된 파일(**.class)들을 로드

5. Execution engine(실행 엔진) 은 로딩된 class 파일을 해석

6. 해석된 파일들은 Runtime Data Area(할당 메모리)에 배치되고 실질적 수행이 이루어짐

 

Java 프로그램을 실행해보기(실습)

1. Hello.java파일을 만들어준다. 

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

2. cmd창을 열어 Hello.java가 있는 폴더로 이동한다.

D:\workspace\java>dir

D 드라이브의 볼륨: 드라이브

D:\workspace\java 디렉터리

2020-11-15  오후 02:10    <DIR>          .

2020-11-15  오후 02:10    <DIR>          ..

2020-11-15  오후 02:09               119 Hello.java

1개 파일                 119 바이트

2개 디렉터리  56,440,229,888 바이트 남음

3. Hello.java를 컴파일하기 - javac로 컴파일하기

컴파일하고 나면 Hello.java파일에서 Hello.class파일이 새로 생긴다. (2번과 비교)

D:\workspace\java>javac Hello.java

D:\workspace\java>dir

D 드라이브의 볼륨: 드라이브

D:\workspace\java 디렉터리

2020-11-15  오후 02:10    <DIR>          .

2020-11-15  오후 02:10    <DIR>          ..

2020-11-15  오후 02:12               416 Hello.class

2020-11-15  오후 02:09               119 Hello.java

2개 파일                 535 바이트

2개 디렉터리  56,440,229,888 바이트 남음

4. Hello클래스를 실행시키기

D:\workspace\java>java Hello 
Hello World!

 

Java 버전에 따른 실행

Q. Java 14 버전으로 컴파일된 파일을 Java 8 버전으로 실행을 한다면 어떻게 될까?

📢 실행이 안된다. 상위 버전의 바이트코드는 하위 버전의 자바에서 실행할 수 없다.

 

Q. Java 8 버전으로 컴파일된 파일을 Java 14 버전으로 실행을 한다면 어떻게 될까?

📢 실행된다.

 

Q. 그러면 상위 버전의 바이트코드는 하위 버전의 자바에서 실행을 전혀 할 수 없을까?

📢 Java Compiler version option을 줄 경우 가능하다. C\:>javac -source 1.6 -target 1.6 -bootclasspath C:\jdk1.6.0\lib\rt.jar -extdirs "" OldCode.java 이런 식으로 사용하면 된다.

 

바이트코드란 무엇인가

바이트코드는 JVM(자바가상머신)이 이해할 수 있는 기계어이다. JVM은 바이트코드를 해당 OS의 기계어에 맞게 변환하여 OS로 전달한다.

 

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

JIT 컴파일은 'Just-In-Time Compilation'의 약어로 정적 컴파일 방식과 인터프리터가 합쳐진 방식이다.

 

프로그램을 실제 실행하는 시점에(실시간으로) 기계어로 변환된 코드를 캐시에 저장한다. 이후 컴파일할 때는 변경된 부분만 컴파일하고 동일한 부분은 캐시에 저장된 코드를 사용한다. 이때, 기계어 변환은 코드가 실행되는 과정에서 실시간으로 일어나기 때문에 'Just-In-Time'이라는 단어가 붙었다. JIT 컴파일러는 프로그램을 실행할 때 사용됨으로 JRE 안에 존재한다.

 

자바는 JVM을 거쳐 실행됨으로 속도가 느리다는 단점이 있었지만 JIT컴퍼일러와 발전된 기술로 인해 해당 단점이 보완되었다. 

 

참고