ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 컴파일 과정
    JAVA 2023. 11. 5. 19:36
    728x90

    컴파일 과정

    1. 개발자가 자바 소스코드(.java)를 작성

    2. 자바 컴파일러가 자바 소스파일을 컴파일하여 자바 바이트 코드(.class)로 변환, 자바 바이트 코드는 컴퓨터는 읽지 못하고 JVM에서 읽을 수 있습니다.

    3. 컴파일된 자바 바이트 코드를 JVM의 클래스 로더에게 전달하고 클래스 로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(JVM 메모리)에 올립니다.

    4. 실행 엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와 실행합니다.

     

    클래스 로더

    클래스 로더가 클래스들을 로딩 및 링크하는 과정은 다음과 같습니다.

    1. 로드: 클래스 파일을 가져와 JVM 메모리에 로드
    2. 검증: 자바 언어 명세, JVM 명세에 명시한대로 구성되어 있는지 검사
    3. 링킹: 클래스가 필요로 하는 필드, 메소드, 인터페이스 등의 메모리를 할당
    4. 분석: 클래시의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
    5. 초기화: 클래스의 필드들을 적절할 값으로 초기화

    클래스 로더는 하나만 존재하는 것이 아닌 계층적은 구조를 이루고 있아 상위 클래스 로더가 가져온 내용을 확인하고 찾지 못한 경우 하위 클래스 로더가 클래스를 로드하게 됩니다.

     

    실행 엔진

    실행 엔진 동작은 2가지 방식으로 나뉘어집니다.

    • 인터프리터: 바이트 코드 명령어를 하나씩 읽고 해석하고 실행합니다. 각 명령어의 실행은 빠를 수 있으나 전체적인 실행 속도는 느릴 수있다는 단점을 갖고 있습니다.
    • JIT(Just In Time Compiler): 바이트 코드 전체를 컴파일하여 바이너리 코드로 컴파일 후 캐시하는 방식으로 전체적인 실행 속도는 인터프리터 방식보다 빠릅니다.

     

    런타임 데이터 영역

    런타임 영역에는 5가지 영역(메서드 영역, 힙 영역, 스택 영역, PC 레지스터, 네이티브 메소드 스택)으로 세분화되어있습니다.

    각 영역의 역할을 다음과 같습니다.

     

    메서드 영역

    클래스 로더의 로딩 과정을 통해 불러온 래스와 인터페이스에 대한 필드 및 메서드 정보, 스태틱 변수, 메서드의 바이트 코드 등이 메소드 영역에 저장됩니다.

    메소드 영역은 JVM을 어떻게 만드냐에 따라 다양한 형태로 구현할 수 있습니다. 메소드 영역에는 런타임 상수 풀이라는 영역도 존재하는데 이는 각 클래스와 인터페이스의 상수, 메소드의 모든 정보를 담고 있는 테이블을 의미합니다. JVM은 런타임 상수 풀에서 특정 메서드나 필드의 실제 메모라 주소를 찾아서 참조하게 됩니다.

    모든 스레드가 공유하는 메모리 영역입니다.

     

    힙 영역

    인스턴스나 객체를 생성하면 힙 영역에 저장됩니다. 메소드 영역과 동일하게 모든 스레드가 공유하는 메모리 영역입니다.

     

    스택 영역

    메서드가 실행될 때마다 하나의 스택이 생성되고 메소드가 종료되면 스택이 제거되는 형태로 저장됩니다.

     

    PC 레지스터

    현재 스레드가 수행중인 JVM 명령의 주소값을 저장합니다.

    멀티 쓰레드 환경에서 한 쓰레드가 작업하다가 다른 스레드로 CPU 점유를 넘겨주고 복귀했을 때 참조하고 있던 주소를 기억하는 용도로 사용됩니다.

     

    네이티브 메서드 스택

    자바의 바이트 코드가 아닌 다른 언어로 작성된 메서드를 저장하는 영역입니다.

    728x90

    'JAVA' 카테고리의 다른 글

    [JAVA] Class Object Instance 차이  (0) 2020.07.04
    [JAVA] 스트림(Stream)  (0) 2020.05.21
    [JAVA] 람다식(Lambda Expression)  (0) 2020.05.21
    [JAVA] 제네릭(Generic)  (0) 2020.04.06
    [JAVA] Overloading과 Overriding의 차이  (0) 2020.03.31
Designed by Tistory.