JAVA/STUDY HALLE

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

 

목표


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

 

학습할 것


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

 

1. JVM이란 무엇인가?


JVM이란

JVM(Java Virtual Machine)은 이름 그대로 자바 가상 머신으로 자바로 구성된 바이트 코드를 실행시키기 위한 가상의 코드입니다.

자바 언어로 작성되어 있는 프로그램들은 자바 가상 머신에서만 실행될 수 있습니다. 따라서 어떤 운영체제든 자바 가상 머신이 설치되어 있다면 자바로 작성된 프로그램이 실행 될 수 있는 것입니다.

이러한 작동 방식으로 개발자는 한번만 작성하면 다른 모든 운영체제에서 사용할 수 있다는 장점이 존재하지만,

단점으로는 다른 언어와는 달리 자바 가상머신을 거쳐서 실행되는 방식이므로 상대적으로 실행 속도가 느리다는 단점이 있습니다.

그렇기 때문에 속도가 중요한 작업을 수행할때는 다른 언어를 사용하는 경우가 일반적인걸로 알고있습니다. 아두이노의 마이크로컨트롤러같이 하드웨어를 다루는 일 즉 Iot분야라면 주로 C언어나 좀더 low level의 언어로 코드를 짜는 경우가 일반적입니다.

 

2. 컴파일 하는 방법


컴파일이란

사람이 작성한 소스코드를 컴퓨터가 이해할 수 있도록 기계어 구조로 변환해주는 과정을 컴파일이라고하며, 이러한 과정을 도와주는 프로그램을 컴파일러 라고 합니다.

이때 자바의 경우에는 컴퓨터가 아닌 자바 가상머신이 이해할 수 있도록 변환하는 과정이 컴파일과정이 되는겁니다.

(.java -> .class)

자바 컴파일러는 자바를 설치하게 되면 javac.exe라는 실행 파일의 형태로 설치가 됩니다.

컴파일 하는 방법

filename.java 으로 저장된 소스코드를 터미널 환경에서 javac filename.java 하게되면 작성한 코드에 문제가 없을경우 컴파일 과정이 이뤄지게 됩니다.

 

이런 과정을 항상 터미널에서 치며 작업을 하기에는 불편하기때문에 통합 개발 환경이 생겨나게 되었고, IDE에서 java 파일을 컴파일 하는 과정도 위의 과정과 같이 javac.exe파일을 거쳐 컴파일하게 됩니다.

 

3. 실행하는 방법


실행하는 방법은 컴파일 하는 방법과 마찬가지지만 java.exe라는 자바가상머신을 이용하여 실행하게 됩니다.

터미널환경에서는 java 명령어를 사용하여 실행할 수 있습니다.

 

4. 바이트코드란 무엇인가?


컴퓨터 언어는 한 사람이 다 알지 못할정도로 많은 컴퓨터 언어가 존재하고, 이런 high level의 컴퓨터 언어에서 hello world를 출력하는 프로그램을 코딩하는 방식도 정말 다양할 것이다. 그렇다면 컴퓨터에서 이런 언어를 하나하나 이해하고 실행해주는 것일까? 그렇지않다. 사람은 사람이 이해할 수 있는 여러가지 프로그래밍 언어로 코드를 짜고, 각자 언어에 맞는 컴파일러를 이용해 컴퓨터가 이해할 수 있는 형태로 바꿔주게 되는 컴파일 과정을 거쳐 컴퓨터가 프로그램을 이해하고 작동하게 된다. 그리고 컴퓨터가 이해할수있는 형태의 코드를 바이트코드라고 하는 것이다. 

이러한 과정이 자바에서는 javac라는 컴파일러를 통해 .java파일이 .class확장자를 갖는 바이트 코드로 만들고 JVM이 이 코드를 실행하는 것이다.

 

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


High level의 언어로 프로그램을 코딩하는 것은 컴퓨터가 이해 할 수 없기에 컴퓨터가 이해할수있도록 low level의 컴퓨터언어로 변환해준다고 했습니다. 이런 변환 과정은 전통적으로 컴파일 방식 외에도 사실 인터프리터 방식이 있습니다.

컴파일 방식은 번역작업이 완료된 코드를 저장해 놓고 해당 코드를 실행하는 방식이라면, 인터프리터 방식은 실행과 동시에 코드의 번역작업을 거쳐 컴퓨터에 전달되어 실행되는 방식을 가지고 있습니다.

동적 번역이라고도 불리는 JIT 컴파일러(Just-In-Time Compiler)는 위 두가지 방식을 혼합한 방식으로 이해할 수 있습니다.

인터프리터 방식으로 코드가 번역되면서 실행됨과 동시에 해당 기계어가 저장되고, 만약 동일한 방식의 명령이 수행될 때 저장된 기계어를 이용함으로써 같은 명령이 실행될때마다 매번 기계어를 생성하는 것을 방지하게 됩니다. 

 

6. JVM의 구성요소


JVM의 구성요소는 크게 세가지로 나누어 볼수 있겠습니다.

Class Loader

컴파일된 클래스 파일을 불러오고 (Loading), 그와 동시에 저장(Linking)하면서 클래스를 관리해주니다.  

Execution Engine

클래스 로더를 통해 런타임 데이터 영역에 있는 클래스를 로딩시키는 작업을 마치게 되면

JVM의 실행엔진에서 인터프리터JIT컴파일러를 통해 실행하게 됩니다.

 

그리고 Garbage Collection을 통하여 메모리를 관리해줍니다.

 

Runtime Data Area

Runtime Data Areasms 는 프로그램을 수행하기 위해서 할당 받은 메모리 공간을 말합니다.

 

7. JDK와 JRE의 차이점


자바로 개발을 하기위해서는 JDK(Java Development Kit)이라는 자바 개발 도구가 있어야합니다. JDK에는 자바를 실행하기 위한 컴파일러 뿐 아니라 자바 개발에 필요한 도구들을 포함하고 있는 도구입니다.

이전에도 말했듯이 자바는 JVM위에서 돌아가기 때문에 JVM을 설치해 주어야 합니다. 이러한 자바 실행 환경을 구성해 주는 것이 바로 JRE(Java Runtime Environment) 입니다. JRE은 자바로 프로그래밍 된 애플리케이션을 실행하기 위한 최소한의 실행 환경을 제공합니다.