ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 컴파일,런타임과정
    java 2024. 12. 21. 12:56

    1.개요

    많은 블로그나 자료에서 컴파일과정에 대해 잘못 설명하고있어 이를 바로 잡기 위해 작성하게 됐습니다.

     

    2.타 블로그 및 자료에서 설명하는 컴파일 과정

    1. 개발자가 자바 소스코드(.java)를 작성합니다.
    2. 자바 컴파일러(Java Compiler)가 자바 소스파일을 컴파일합니다. 이때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드입니다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있습니다.
    3. 컴파일된 바이트 코드를 JVM의 클래스로더(Class Loader)에게 전달합니다.
    4. 클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data area), 즉 JVM의 메모리에 올립니다.
    5. 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다. 이때, 실행 엔진은 두가지 방식으로 변경합니다.

     

    3.위 컴파일 과정의 잘못된 부분

    위 내용에서 컴파일 과정은 2번에서 끝난다. 즉 자바파일을 클래스 파일로 변환하는게 컴파일과정이다.

    3번 이후의 과정은 런타임과정이다.

     

    4.컴파일/런타임 정리

    자바 컴파일과정

    1.자바 소스코드 작성

    2.컴파일러에 의해 자바파일이 클래스 파일로 변환(javac 프로그램 및 명령어 사용)

     

    자바 런타임과정

    1.클래스 로더(class loader)가 클래스파일을 런타임데이터 영역(jvm 메모리 - 메서드 영역)에 순차적으로 로드(java 프로그램 및 명령어 사용)

    • 메서드 영역 : 클래스 정보, 필드, 메서드 정보가 저장됨
    • 클래스파일 = 바이트 코드

    2.실행 되어야 할 클래스의 메서드를 메서드 영역에서 가져와서 스택 영역에 쌓음 (메서드가 호출될 때 마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거된다.)

    3.실행 엔진(execution engine)이 스택에 쌓인 프레임을 순차적으로 실행 (이때 바이트 코드를 기계어로 변환해서 실행함)

    4.이 과정에서 gc 가 메모리 최적화를(힙 영역) 수행해줌

     

    5.오늘의 교훈

    기술내용을 작성할 때 다른 개발자에게 피해를 줄 수 있다는걸 느꼈다. 나 자신도 기술내용을 작성할 때 반드시 더블체크를 한 후 업로드를 할 수 있도록 노력해야겠다.

    'java' 카테고리의 다른 글

    자바 - 와일드카드  (0) 2025.12.14
    자바 - 제네릭  (0) 2025.12.14
    스레드  (0) 2024.08.24
    멤버 상수 final , static 알고가기  (0) 2019.12.05
    자바 - 클래스,인스턴스,객체  (0) 2019.12.05
Designed by Tistory.