목표
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.
목차
- JVM이란 무엇인가
- 컴파일 하는 방법
- 실행하는 방법
- 바이트코드란 무엇인가
- JIT 컴파일러란 무엇이며 어떻게 동작하는지
- JVM 구성 요소
- JDK와 JRE의 차이
1. JVM 이란 무엇인가?
- 자바 프로그램을 실행할 수 있는 가상 머신을 말한다.
- WORA (Write Once, Run Anywhere) : 자바 릴리즈 이전에는 Window, Linux, Mac 등 특정 운영체제에 맞추어 프로그래밍 해야하는 불편함이 있었다. JVM은 어느 운영체제이던지 상관없이 자바 프로그램을 실행할 수 있도록 해준다.

출처 : https://www.infoworld.com/article/3272244/what-is-the-jvm-introducing-the-java-virtual-machine.html
2. 컴파일 하는 방법은?
- 자바 JDK를 설치한 경로안에 bin을 보면 javac라는 이름의 컴파일러를 볼수있다.
- C:\Program Files\Java\jdk-11\bin (내 pc 경로)

에디터로 다음과 같이 간단한 자바소스 코드를 작성하였다.
javac Hello.java
터미널에서 Hello.java가 위치가 경로로 이동 뒤 다음과 같이 입력해주면 컴파일이 된다.
단, jdk bin 경로를 환경변수에 등록해 주어야 바로 javac 명령어를 사용할 수 있다.
컴파일이 완료되면 Hello.class라는 파일이 생성된걸 확인할 수 있다.
3. 실행하는 방법은?
java Hello

다음과 같이 실행되는 걸 볼수있다.
4. 바이트 코드란 무엇인가?
- 바이트코드는 JVM이 실행할 수 있는 2진코드를 말한다.
- 위에서 Hello.java파일을 컴파일하면 Hello.class라는 파일이 생성되는걸 보았다. 이 파일이 바이트코드로 작성된 class파일이다.
- 이 바이트코드 파일은 어느 OS든지 상관없이 각 OS에 맞는 JVM만 설치되어 있으면 실행 가능하다.
5. JIT 컴파일러란 무엇이며 어떻게 동작하는지?
- JIT컴파일러는 자바 바이트코드를 런타임에 바로 기계어로 변환하는 컴파일러를 말한다.
- JIT컴파일러는 런타임시 바이트코드를 네이티브 기계어로 한번에 컴파일 한 후 사용한다.
- 컴파일 후 캐싱하고 이후에 변경된 부분만 컴파일하고 나머지는 캐시에서 가져다 바로 실행한다.
- 이러한 특징때문에 Interpreter방식에 비해서 빠르다.
6. JVM 구성요소

출처 : https://www.geeksforgeeks.org/jvm-works-jvm-architecture/
- Class Loader : *.class 파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리영역에 적재하는 역할을 한다.
- JVM Memory
- Method Area : 모든 클래스정보와 static 변수가 담긴다.
- Heap : new 키워드로 생성된 객체, 배열이 저장되는 영역이며 gc의 대상이 된다.
- Stack : 지역변수, 파라미터 등 연산에 사용되는 임시값이 저장되는 영역이다. 메소드를 호출할때 개별 스택이 생성된다.
- PC Registers : 쓰레드가 생성될 때마다 생성되는 영역이다. 각 스레드의 PC를 저장한다.
- Native method Stacks : 자바가 아닌 다른 언어로 작성된 네이티브 메서드를 지원하기 위해 사용되는 스택
7. JDK와 JRE의 차이는?
- JDK : 자바 개발 도구로써 JDK를 설치하면 JRE도 함께 설치된다.
- JRE : 자바 실행 환경으로써 자바 언어로 작성된 프로그램을 실행하기 위해 필요하다.
참고