본문 바로가기

개발 스토리/Java live study

Java 1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

목표

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

학습할 것

  • JVM이란 무엇인가
  • 컴파일하는 방법
  • 실행하는 방법
  • 바이트코드란 무엇인가
  • JIT 컴파일러란 무엇이며 어떻게 동작하는지
  • JVM 구성 요소
  • JDK와 JRE의 차이

JVM이란 무엇인가

JVM은 'Java virtual machine'을 줄인 것으로 직역하면 '자바를 실행하기 위한 가상 기계'라고 할 수 있다. 자바로 작성된 애플리케이션은 모두 JVM에서만 실행되기 때문에, 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.

일반 애플리케이션의 코드는 OS만 거치로 하드웨어로 전달되는데 비해 Java애플리케이션은 JVM을 한 번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 해석된다.


컴파일하는 방법

  • 메모장을 열고 자바 코드를 입력한 후에 Hello.java로 저장한다. 이때 클래스의 이름 'Hello'가 대소문자까지 정확히 같아야 한다.

 

  • cmd에서 저장한 소스코드가 있는 곳에 위치한다.
  • javac Hello.java라고 입력한다.
  • 입력하면 Hello.class라는 파일이 생긴 것을 확인할 수 있다.
  • java Hello라고 입력하면 정상적으로 코드가 실행되는 것을 볼 수 있다.


바이트코드란 무엇인가

자바 바이트 코드란 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미합니다.

자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트코드라고 불리고 있습니다.

이러한 자바 바이트 코드의 확장자는. class입니다.

자바 바이트 코드는 자바 가상 머신만 설치되어 있으면, 어떤 운영체제에서라도 실행될 수 있습니다.


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

1. JIT 컴파일러란?

자바 파일을 컴파일하게 되면 ". class"확장자를 가진 클래스 파일이 생성된다. 이 클래스 파일은 자바 바이트 코드로 이루어져 있다. 가상 기계를 사용하는 언어에서의 가장 중요한 점으로는 컴파일된 바이트 코드를 어떻게 하면 더 효율적으로 빠르게 실행시킬 수 있을지에 대한 점이다.

 

자바 바이트 코드는 인터프리터 언어(interpreter language)이다. 한 줄씩 읽고 해석하고, 그에 해당하는 기능을 실행시키는 인터프리터 언어이기에 비효율적으로 보일 수 있겠지만, 가상 머신에서 돌아가는 바이트 코드들은 매우 저수준의 인터프리터 언어이기에 자바스크립트 한 줄에 비하면 자바 바이트 코드 한 줄을 해석하고 실행하는 데에는 큰 노력이 필요하지 않는다. 하지만, 아무리 그렇다 하더라도 기기에서 직접 돌아가는 기계어로 컴파일되는 C/C++와 같은 언어들로 만든 실행 파일에 비하면 실행 속도가 느리다.

 

이러한 실행 속도의 문제를 해결하기 위해서 나온 것이 바로 JIT 컴파일러다. JIT 컴파일러는 프로그램 실행 중에 가상 기계 상에서만 돌아가는 자바 바이트 코드를 해당 플랫폼에 맞는 기계어로 컴파일해 주는 특수한 컴파일러다.

 

JIT 컴파일러가 바이트 코드를 기계어로 컴파일하는 시간만큼 프로그램의 실행 시간이 증가하게 된다. 하지만, 만약 매우 복잡하고 다양한 연산들을 하면서 자주 불려지는 메서드를 JIT 컴파일러로 컴파일한다면, 실행 능력을 크게 향상할 수 있다.

또한, JIT 컴파일러는 바이트 코드를 컴파일하는 과정에서 몇 가지 간단한 최적화 과정을 거치게 된다.

 

출처 : https://neos518.tistory.com/93

 

2. JIT 컴파일러는 어떻게 동작하는지

JIT 컴파일러는 JRE(Java Runtime Environment)의 일부로서, 자바 응용 프로그램의 성능을 실행 시간중에 향상해주는 도구이다.

 

알다시피, 자바 파일은 클래스로 이루어져 있으며, 플랫폼 독립적이다. 단, 컴파일된 클래스 파일들은 자바 가상 머신에 종속적이게 된다. 자바 응용 프로그램 실행 시에 자바 가상 기계는 해당 응용 프로그램의 실행에 필요한 클래스 파일들을 로딩한다. 프로그램을 실행하면서 추가로 더 필요한 클래스 파일 등이 있을 경우에는 프로그램 실행 중에 해당 파일들을 읽어 들인다. 이 과정에서 추가적으로 시간이 소모된다. 원래에도 명령을 하나씩 읽고 해석하면서 프로그램을 실행하기에, 추가 로딩이 필요한 경우에는 응용 프로그램의 속도가 그만큼 더 느려주게 된다. 이러한 느린 실행 속도를 향상하기 위해서 존재하는 것이 바로 JIT 컴파일러이다. 실행에 비교적 많은 시간이 걸리는 바이트 코드를 프로그램 실행 중에 컴파일 함으로써 실행 속도를 향상하는 것이다.

 

JIT 컴파일러의 사용 여부는 사용자가 직접 선택할 수가 있다. 다만, JIT 컴파일러가 언제나 응용 프로그램의 성능을 향상해주는 것은 아니기 때문에 작성한 코드를 잘 분석해보고 JIT 컴파일러의 필요 여부를 고려하고 사용하는 것이 좋다.


JVM 구성 요소

자바 가상 머신은 다음과 같이 구성됩니다.

  • 자바 인터파리터(interpreter)
  • 클래스 로더(class loader)
  • JIT 컴파일러(Just-In-Time compiler)
  • 가바지 컬렉터(garbage collector)

자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할을 하는 것이 자바 인터프리터입니다.

 

자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결됩니다.

이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 바로 클래스 로더입니다.

 

JIT 컴파일러는 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기계어로 변환하는 데 사용합니다.

 

자바 가상 머신은 가비지 컬렉터를 이용하여 더는 사용하지 않는 메모리를 자동으로 회수해 줍니다.

따라서 개발자가 따로 메모리를 관리하지 않아도 되므로, 더욱 손쉽게 프로그래밍을 할 수 있도록 도와줍니다.

 

출처 : http://tcpschool.com/java/java_intro_programming


JDK와 JRE의 차이

  • JDK = JRE + @ 이며
  • JRE는 읽기 전용, JDK 읽기 / 쓰기 전용이라 생각할 수 있다.

JRE 개념

JRE : 컴파일된 자바 프로그램을  실행시킬 수 있는 자바 환경

  • JRE는 JVM이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다.
  • JRE는 JVM의 실행환경을 구현했다고 할 수 있다.
  • 자바 프로그램을 실행시키기 위해선 JRE를 반드시 설치해야 한다.
  • 하지만 자바 프로그래밍 도구는 포함되어있지 않기 때문에 자바 프로그래밍을 하기 위해선 JDK가 필요하다.

출처 : https://goodgid.github.io/Java-JDK-JRE/

 

JDK 개념

JDK : 자바 프로그래밍 시 필요한 컴파일러 등 포함

  • JDK는 개발을 위해 필요한 도구(javac, java 등)들을 포함한다.
  • JDK를 설치하면 JRE도 같이 설치가 된다.
  • 즉 JDK = JRE + @라고 생각하면 된다.

출처 : https://goodgid.github.io/Java-JDK-JRE/

 

 

- 참고 자료

tcpschool.com/java/java_intro_programming

neos518.tistory.com/93

goodgid.github.io/Java-JDK-JRE/