Java

Java가 빌드되고 실행되는 과정

재심 2024. 10. 3. 19:51

 

목차

    [자바 코드 작성 (.java 파일 생성)]

    개발자가 코드를 작성하면 .java 파일이 생성된다.

    public class Main {
        public static void main(String[] args) {
            System.out.println("Hello, World!");
        }
    }

     

    컴파일

    자바 컴파일러 (javac)에 의해 바이트 코드로 변환되고 결과물은 .class 확장자를 가진 파일에 저장된다.

    이 파일은 사람이 읽을 수 없는 기계어와 비슷한 중간 코드이다.

     

    아래 커맨드를 입력하면 .class 파일이 생성되고 바이트 코드의 결과물이 생성된다.

    javac HelloWorld.java

     

    [클래스 로딩]

    OS별로 (윈도우, 리눅스, 맥) JRE (Java Runtime Environment)가 개발되어 있고, JRE 안에는 JVM과 각종 라이브러리가 존재한다. JRE만 있으면 자바 컴파일러에 의해 바이트 코드로 된 결과물을 어떤 환경에서든지 실행할 수 있어서 각 환경마다 컴파일러를 개발할 필요가 없게 된다. 그래서 자바는 다양한 플랫폼에서도 잘 실행될 수 있다.

     

    어쨋든 JVM이 .class 파일을 메모리로 로드 하며 이 때 클래스 로더 (class loader)가 바이트 코드를 읽어 메모리에 로드하고 "런타임 데이터 영역 (Runtime Data Area)"에 클래스 정보를 저장한다. 이 때 모든 의존 클래스들도 로딩된다.

    JVM의 클래스 로딩은 "동적 로딩(dynamic loading)"을 지원해서 프로그램이 실행 중일 때 필요한 클래스를 로딩한다고 한다.

     

    [바이트 코드 실행]

    JVM은 인터프리터 또는 JIT컴파일러를 통해 바이트 코드를 실제 기계어로 변환해서 실행한다.

     

    • 인터프리터: 바이트 코드를 한 줄 씩 읽고 실행해서 느릴 수 있음
    • JIT 컴파일러: 자주 사용되는 코드를 기계어러 미리 변환하여 더 빠르게 실행할 수 있음

    [메모리 관리 및 GC]

    자바에서 객체는 JVM의 힙 메모리 영역에 할당된다.

    그리고 GC를 사용해 더 이상 참조되지 않는 객체를 자동으로 메모리에서 제거한다.

     

    아래의 경우 cat1은 GC에 의해 메모리에서 제거된다.

    Car car1 = new Car();  // 객체 car1 생성
    Car car2 = new Car();  // 객체 car2 생성
    car1 = null;           // car1이 더 이상 참조되지 않음 (가비지)

     

    [프로그램 종료]

    JVM은 메모리를 해제하고 종료하며, JVM은 모든 자원을 메모리에 반납한다.