[Java/자바] Compilation and Execution of a Java Program / 자바의 컴파일 과정

sbj·2023년 11월 27일

Java

목록 보기
7/15

Learning Objectives (학습 목표)

  • Before studying Java further, it's important to understand how Java is executed.
    Java를 더 공부하기 전에, 애초에 Java가 어떻게 실행되는 지 알기위함.
  • We need to understand what JDK, JVM, JRE, and JIT are.
    JDK, JVM, JRE, JIT가 무엇인지 알아야겠다.

What is JDK? (JDK란 무엇인가?)

JDK = Java Development Kit

Java application을 실행하고 개발하기 위해 사용되는 도구로 구성되어 있다. Java를 통해 개발하고 실행하기 전에, 컴퓨터/시스템에 JDK를 설치해야 한다.


JDK는 JRE와 Java Development Tools (interpreter/loader, compiler, debugger, an archiver (jar)) 로 구성되어 있다.


What is JRE? (JRE란 무엇인가?)

JRE = Java Runtime Environment

장치에서 Java 프로그램 실행을 위한 환경이다. 오직 Java 실행을 위해서만 사용된다.


What is JVM? (JVM이란 무엇인가?)

JVM = Java Virtual Machine

Java의 런타임 엔진이다. Java의 코드를 line-by-line으로 실행한다. 또한, Interpreter이기도 하다.


How JDK Compile and Run Java Code? (JDK는 어떻게 Java 코드를 실행하는가?)

  1. Java Compiler (Javac → Development tools)는 Java 파일 (.java)을 실행가능한 파일로 전환한다. 이 실행 파일은 운영체제에서 직접 실행할 수 없다. 실제로 이 파일은 중간의 파일로, Bytecode라고 불리며 확장자는 .class 이다.
  2. Bytecode 는 모든 운영체제(Mac, Windows, and Linux 등)에서 지원된다.
  3. Bytecode 를 실행하기 위해 JVM 이 필요한 것이다. Java 컴파일러가 JVM으로 Bytecode 파일을 전달한다. (JVM은 각 운영체제마다 다르며 운영체제마다 호환되는 JVM 필요)

In JVM, Three stage performed

  1. Class Loader
  2. Bytecode Verified
  3. Java-In-Time Compiler

Heap Area (힙 영역)
JVM 메모리의 일부로, 모든 객체 정보가 Heap 영역에 저장된다.


Class Loader run 3 process :

  1. Loading
  2. Linking
  3. Initializing
  1. Loading (로딩)

Bytecode는 메소드 영역에 저장되고 클래스가 메모리에 로딩된다.
메소드 영역은 JVM 메모리의 일부분이며, 모든 클래스 이름, parent 클래스 이름, 메소드, 변수 정보가 저장된다.

  1. Linking (연결)

클래스와 인터페이스가 JVM 내에서 런타임 상태로 결합된다. 즉, 실행할 수 있게 된다.

3.Initialization (초기화)

이전 섹션의 연결 클래스가 실행된다.


클래스 로더 프로세스에 대해 더 잘 이해해보자.

  1. Loading (로딩) → 클래스 파일을 가져와서, JVM 메모리에 로딩한다.
  2. 검증 → 자바 언어 명세 및 JVM 명세서에 명시된 대로 구성되어 있는지 검사한다.
    1. 프로그램에서 선언하지 않은 변수 사용하거나, overflows하면 예외 발생시키고 컴파일링 중지.
  3. 준비 → 클래스가 필요로하는 메모리 할당한다. (필드, 메서드, 인터페이스 등)
  4. 분석 → 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변환한다.
  5. 초기화 → 클래스 변수들을 적절한 값으로 초기화한다.

Final Execution Step

  1. Interpreter: Bytecode를 한 줄 한 줄 해석하고 실행한다.
  2. Just-In-Time Compiler : 전체 Bytecode를 컴파일하고, 머신 코드로 변환한다.
  3. Garbage Collector: 참조되지 않은 객체를 파괴한다.

The compile process is done!


Summary

  1. 개발자가 자바 소스코드를( .java) 작성한다.
  2. 자바 컴파일러(Java compiler)가 자바 소스파일을 컴파일한다. → 이 때 파일은 Bytecode (.class) 파일로, 컴퓨터가 읽을 수 없는 JVM만이 이해할 수 있는 코드이다.
  3. 컴파일 된 Bytecode (컴파일러에 의해)를 JVM의 클래스 로더(Class Loader)에게 전달한다.
  4. 클래스 로더(Class Loader)는 동적 로딩을 통해 → 클래스들을 로딩,링크하여 JVM 메모리 영역에 올린다.
  5. 실행 엔진 → JVM 메모리에 올라온 Bytecode를 명령어 단위로 하나씩 가져와서 실행한다.
    1. 인터프리터: Bytecode 명령어를 line-by-line 읽어서 해석하고 실행한다.
    2. JIT (Just-In-Time) 컴파일러: 인터프리터 단점을 보완하기 위해 도입됨. Bytecode 전체를 컴파일 하여 바이너리 코드로 변경하고, 이후에는 메서드를 인터프리팅하지 않고, 바이너리 코드로 직접 실행한다. → 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적 실행 속도가 인터프리팅 방식보다 빠르다.
profile
Strong men believe in cause and effect.

0개의 댓글