Study/Java

자바 스터디 - 1주차 (JVM, java, JDK, JRE, 바이트코드)

pmh 2021. 5. 9. 19:29

백기선 님의 라이브 스터디를 따라, 정리해보았습니다.

🎯 목표

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


☑️ 학습할 것

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

1. JVM이란 무엇인가

JVM(Java Virtual Machine)이란, '자바를 실행하기 위한 가상머신' 이다. 여기서 가상머신이란, 컴퓨팅 환경을 소프트웨어로 구현한 것으로 가상머신 상에서 운영 체제나 응용 프로그램을 설치 및 실행할 수 있다.
여기서 JVM 은 Java 애플리케이션을 실행하기 위해서 사용되어진다.

자바 애플리케이션은 일반 애플리케이션과 다르게 모두 이 JVM 에서만 실행되기 때문에, 자바 애플리케이션은 항상 JVM을 필요로 한다. 이는 일반 애플리케이션이 OS를 거쳐 컴퓨터(하드웨어)로 전달되는 것과는 다르다.

여기서 자바 애플리케이션은 JVM을 한번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 해석되기 때문에 속도가 느리다는 단점을 가지고 있다. 하지만 이는 바이트코드(컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 향상된 최적화 기술이 적용되어서 속도의 격차를 많이 줄였다.

자바 바이트코드는 플랫폼에 독립적이며, 모든 JVM은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현된 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.

JVM은 자바 바이트코드를 실행할 수 있는 주체.
인터프리터나 JIT컴파일 방식으로 바이트코드를 실행할 수 있도록 구현.
자바 바이트코드는 플랫폼에 독립적 -> 모든 자바 프로그램은 CPU, OS의 종류에 상관없이 동일하게 동작함.

2. 컴파일 하는 방법

컴파일이란 특정 프로그래밍 언어로 쓰여 있는 문서를, 다른 프로그래밍 언어로 옮기는 행위이다.
자바의 경우에는 자바 컴파일러를 통해 자바 소스 코드를 자바 바이트코드로 컴파일한다.

javac fileName.java

결과물로 fileName.class가 생성된다. 생성된 .class 파일은 JVM이 실행할 수 있다.

3. 실행하는 방법

java fileName (확장자 .class 생략가능)

컴파일된 바이트코드는 JVM을 통해 다음과 같은 과정을 따라 실행됩니다.

  1. Class Loader
    ClassLoader System을 통해 .class 파일을 JVM 내의 Runtime Data Areas에 할당되는데 이는 JVM이 프로그램이 수행하기 위해 OS로부터 할당받는 메모리 영역이다.
  2. Bytecode Verifier
    JVM으로부터 로드된 Bytecode는 Execution Engine을 통해 실행되는데 이 때, Interpreter 방식과 JIT Compiler 방식을 사용한다.

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

바이트코드란 특정 하드웨어가 아닌 가상 컴퓨터 (Virtual Machine)에서 돌아가는 실행 프로그램을 위한 이진 표현법입니다.

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

JIT 컴파일(Just-In-Time)이란 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.
JIT 컴파일러는 자바 런타임(JRE)의 구성요소로, 런타임에 바이트 코드를 기계 코드로 컴파일하여 바이트 코드를 더 빠르게 실행하도록 도와줍니다. 이는 일반적인 인터프리터에 비해 빠릅니다.
JIT 컴파일은 다음 단계로 구성됩니다.

  1. 인라이닝 (inlining)
  • 인라이닝은 자주 실행되는 메서드를 본문으로 대체하여 메서드 호출의 오버헤드를 피할 수 있습니다. 하지만 자주 실행된다고 해서 반드시 메서드가 인라인 되는것은 아닙니다. 이는 FreqInlineSize 플래그에 의해 제한됩니다.
  1. 로컬 최적화 (local optimizations)
  2. 제어 흐름 최적화 (control flow optimizations)
  3. 글로벌 최적화 (global optimizations)
  4. 네이티브 코드 생성 (native code generation)

6. JVM 구성요소


JVM은 Class Loader, Execition Engine, Runtime Data Area로 구성되어있다.

7. JDK와 JRE의 차이

JRE란, Java Runtime Enviroment로, 자바 소프트웨어를 실행하기 위한 소프트웨어입니다. 이는 클래스 라이브러리, 로더 클래스, JVM을 포함합니다.
JDKJava Development Kit으로, JRE에서 제공하는 실행 환경과 자바 개발에 필요한 여러 가지 명령어와 컴파일러를 포함합니다.