Language/Java

[JAVA] 컴파일 과정

검은 까마귀 2024. 4. 9. 15:21

# JVM(Java Virtual Machine)

JAVA의 가장 큰 장점은 OS에 독립적이라는 것이다.

따로 Machine을 갖고있는데 그게 JVM이다. (우리가 사용하는 VM의 한종류라고 볼 수있다.)

 

어떤 방식으로 Compile을 하길래 OS에서 독립적일까?

https://www.tcpschool.com/java/java_intro_programming

 

# Compile 과정

  1. 개발자가 소스코드를 소스파일 (.java) 에 작성한다.
  2. Java의 컴파일러가 소스파일 (.java) Compile한다.
  3. 그 결과는 바이트 코드(.class)로 출력된다. 하지만, 바이트 코드(.class) 는 아직 JVM이 이해할 수 없다.
  4. Class Loader가 Dynamic Loading을 통해 필요한 클래스들을 로딩 및 링크하여 JVM에 올린다.
    1. Load:  바이트 코드(.class)를 JVM 메모리에 로드
    2. 검증: 명세에 맞춰서 작성되어있는지 제대로 썼는지 확인
    3. 준비: 클래스가 필요로 하는 메모리 할당
    4. 분석: 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
    5. 초기화: 클래스 변수들을 적잘한 값으로 초기화
  5. Excute Engine(런타)은 JVM메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행
    • Interpreter: 바이트 코드 명령어를 하나씩 읽어서 해석➡️하나하나 실행은 빠르나, 전체 실행속도 저하
    • JIT컴파일러(Just-In-Time Compiler):인터프리터를 보완하여 바이트 코드를 변경하여 해당 메소드를 더이상 인터프리팅하지 않고 바이트 코드 전체가 컴파일된 바이너리 코드를 실행 ➡️ 전체가 한번에 실행으로 속도 빠름

여기까지가 전체적으로 개괄적인 내용이다. 그러면 하나씩 뜯어보자

 

# Dynamic Loading

프로그램을 실행할때, 필요할때마다 동적으로 메모리를 할당하고 적재하며, 필요 없는 메모리는 자동으로 할당해제하여, 메모리를 효율적으로 관리하는 방식이다. 이는 메모리를 효율적으로 관리하는 방법중 하나이다.

반대로 Static Loading도 있는데 프로그램을 실행할때, 모든 실행파일을 메모리에 적재하는 방식이다. (반대의 방식은 느리다.)

 

# Class Loader

Class Loader는 계층(Layer)구조로 이루어져있다. (화살표 방향은 클래스를 찾는 방향이다.)

최초 진입을 순서대로 설명하도록 하겠다.

  1. Bootstrap ClassLoader
    • JVM실행시 최초로 실행
    • JAVA 자체의 클래스로더로써 Object 클래스, Java API를 로
  2. Extension ClassLoader
    • 기본 Java API를 제외한 확장 클래스들을 로드
  3. System ClassLoader
    • 개발자가 만든 클래스들을 로드한다.
    • 사용자가 지정한 ClassPath내의 클래스를 로드
  4. User-Defined ClassLoader  
    • 직접 코드상에 생성한 Class Loader

이러한 계층적 구조에서 Class를 찾을때 위임을 하게 되는데 이를 "위임 모델"이라고 부른다.

 

4번부터 클래스가 로드 되어있는지 확인한다. 없으면, 3번에게 위임

3번도 없으면 2번에게 위임

2번도 없으면 1번에게 위임

1번도 없으면 ClassNotFoundException을 발생상한다.


위임을 포함하여 3가지 ClassLoader원칙이 있다.

  1. 위임원칙
  2. 가시범위 원칙: 하위클래스로더는 상위 클래스로더가 로딩한 클래스를 보지만, 상위 클래스로더는 하위 클래스로더가 로딩한 클래스는 볼수 없다.
  3. 유일성 원칙: 이미 로드한 클래스를 다시 로드하지 않아야한다. (위임원칙으로 지켜진다.)
반응형

'Language > Java' 카테고리의 다른 글

[JAVA] Error VS. Exception  (0) 2024.04.09
[JAVA] Gabage Collection (2)🗑️  (0) 2024.04.09
[JAVA] Gabage Collection (1)🗑️  (1) 2024.04.09
[JAVA] 상속 👨‍👩‍👧‍👦  (2) 2023.09.12
[JAVA] JVM 메모리 구조  (0) 2023.09.12