자바(java)의 실행 체계

허성재's avatar
Aug 13, 2024
자바(java)의 실행 체계
Java의 실행 체계는 Java 프로그램이 작성되어 실행되기까지의 과정을 의미하며, 이 과정은 여러 단계로 구성됩니다. Java는 플랫폼 독립성을 제공하기 때문에, 한 번 작성된 프로그램이 다양한 운영 체제에서 동일하게 실행될 수 있습니다. 이를 가능하게 하는 핵심 요소는 **Java Virtual Machine(JVM)**입니다. 아래는 Java 프로그램이 실행되는 전체 과정을 설명한 것입니다.

1. Java 프로그램 작성

개발자는 먼저 Java 소스 코드를 작성합니다. 이 소스 코드는 .java 파일로 저장됩니다. Java는 객체 지향 언어이므로, 코드는 클래스와 객체로 구성됩니다.
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
위 예제는 가장 간단한 Java 프로그램으로, "Hello, World!"라는 문구를 출력하는 코드입니다.

2. 컴파일 (Compilation)

Java 소스 코드를 실행하려면 먼저 컴파일(compile) 과정이 필요합니다. 컴파일은 소스 코드(.java 파일)를 **바이트코드(bytecode)**라는 중간 코드로 변환하는 과정입니다. 이 과정에서 Java 컴파일러(javac)가 사용됩니다.
javac HelloWorld.java
이 명령을 실행하면, HelloWorld.class라는 바이트코드 파일이 생성됩니다. 이 바이트코드는 특정 운영 체제에 종속되지 않고, 모든 JVM에서 실행될 수 있는 형식입니다.

3. 클래스 로딩 (Class Loading)

Java 프로그램이 실행되면, JVM은 먼저 필요한 클래스 파일들을 메모리로 로드합니다. 이 과정은 **클래스 로더(Class Loader)**에 의해 수행되며, 이 단계에서 프로그램에서 사용되는 모든 클래스들이 메모리로 로드됩니다. 클래스 로더는 세 가지 기본적인 종류의 클래스 로더를 통해 이 작업을 수행합니다.
  1. Bootstrap ClassLoader: 가장 기본적인 클래스 로더로, JRE의 핵심 라이브러리(rt.jar)를 로드합니다.
  1. Extension ClassLoader: 추가적인 라이브러리(lib/ext 폴더)를 로드합니다.
  1. Application ClassLoader: 애플리케이션에서 사용자가 작성한 클래스들을 로드합니다.

4. 링크(Linking)

클래스 로딩 후, JVM은 로드된 바이트코드를 링크합니다. 이 단계는 다음과 같은 과정으로 이루어집니다:
  1. 검증(Verification): 바이트코드가 유효하고, 보안에 위협이 없는지 검사합니다. 이를 통해 악의적인 코드가 실행되는 것을 방지합니다.
  1. 준비(Preparation): 클래스에 선언된 모든 정적 변수들을 메모리에 할당하고 초기화합니다.
  1. 해결(Resolution): 프로그램이 참조하는 모든 심볼릭 레퍼런스(변수, 메서드 등)를 실제 메모리 주소로 변경합니다.

5. 실행(Execution)

이제 JVM은 바이트코드를 실행합니다. 이 단계에서는 **인터프리터(Interpreter)**와 **JIT 컴파일러(Just-In-Time Compiler)**가 핵심 역할을 합니다.
  1. 인터프리터(Interpreter): JVM은 바이트코드를 한 줄씩 읽고, 각 줄을 즉시 실행합니다. 이 방식은 초기 실행 속도가 빠르지만, 반복되는 코드의 경우 성능이 떨어질 수 있습니다.
  1. JIT 컴파일러(Just-In-Time Compiler): JVM은 반복적으로 실행되는 바이트코드를 네이티브 기계어로 컴파일하여 성능을 최적화합니다. 이 과정에서 컴파일된 기계어는 캐시에 저장되어, 이후 호출 시 빠르게 실행됩니다. JIT 컴파일러는 프로그램의 실행 성능을 크게 향상시킬 수 있습니다.

6. 실행 중 메모리 관리

Java는 실행 중에 **가비지 컬렉션(Garbage Collection)**을 통해 자동으로 메모리를 관리합니다. 가비지 컬렉션은 더 이상 참조되지 않는 객체를 자동으로 식별하고 메모리에서 해제합니다. 이 덕분에 개발자는 직접 메모리 관리를 하지 않아도 되지만, 가비지 컬렉션이 실행되는 동안 약간의 성능 저하가 발생할 수 있습니다.

7. 종료(Termination)

프로그램이 종료되면 JVM은 모든 자원을 해제하고, 프로그램의 실행을 끝냅니다. 이 과정에서 가비지 컬렉터는 남아 있는 불필요한 메모리를 정리하며, JVM이 정상적으로 종료됩니다.

요약

Java의 실행 체계는 소스 코드 작성에서 시작해, 컴파일, 클래스 로딩, 링크, 실행, 그리고 종료까지 여러 단계로 이루어집니다. JVM은 이 과정에서 바이트코드를 실행 가능한 형태로 변환하여 플랫폼 독립성을 유지하고, JIT 컴파일러와 가비지 컬렉션 등을 통해 프로그램의 효율성과 안정성을 보장합니다. 이러한 실행 체계 덕분에 Java는 다양한 플랫폼에서 일관된 성능과 안정성을 제공할 수 있습니다.
Share article

heo-gom