KKanging

JVM 클래스 로딩 과정 본문

JAVA/JVM

JVM 클래스 로딩 과정

천방지축 개발자 2024. 8. 13. 00:37

JVM의 클래스 로딩 과정

JVM 의 바이트 코드 실행 전체 구조

  1. 자바 소스 파일을 컴파일 하여 자바 바이트 코드로 변환하면 제일 먼저 메인 메서드의 클래스가 클래스 로더에 의해 로드 된다.
  2. 클래스 로더에 의해 클래스의 정보 멤버 변수, 전역 변수, 상수, 메서드,, 등등이 Method Area에 점유하게 된다.
  3. 실행 엔진에 의해서 실행을 한다
  4. 이때 실행을 진행하다가 클래스가 참조 되어 있는 부분을 발견하면 클래스 로더로 로드 된 클래스인지 확인한다 (로드 된 클래스라면 그냥 Method Area에 가져다 쓸 것)
  5. 만약 로드 되지 않았다면 클래스 로더가 해당 클래스를 로드하고 초기화 한다.
    • 다음 모든 경우에 클래스를 로드하고 초기화 한다.
      • 생성자 호출(클래스 생성)
      • 클래스의 메서드 호출(당연)
      • 클래스의 전역 메서드 호출
      • 클래스의 전역 변수 호출
  6. 이때 로드 됐을 때 런타임 상수 풀에 심볼릭 링크는 실제 주소로 변환된다.
    • 이런 점이 리플랙션을 가능하게 하지만 리플랙션은 조금 더 동적인 실행 방식을 가진다. 리플랙션은 메서드 필드 마저도 동적으로 결정되기 때문

클래스 로더의 종류

Bootstrap Class Loader

  • JVM을 실행하는데 필요한 클래스를 로딩하는 클래스 로더

제일 최상위 클래스 로더

Platform Class Loader

  • java.lang.ClassLoader의 인스턴스로 Java SE platform API 등 자바에서 기본적으로 제공해주는 클래스를 로딩할 때 사용된다.

System Class Loader

  • java.lang.ClassLoader의 인스턴스로 유저가 작성한 클래스를 로딩할 때 사용된다.
  • ClassPath에 명시된 경로를 통해 클래스를 찾는다.
  • Platform Class Loader를 부모로 가지고 있다.
  • JAVA 8까지는 Applicaiton Class Loader로 불리다가 모듈 시스템이 도입되면서 Platform Class Loader로 명칭이 바뀌었다.

클래스 로더의 특징

  • 계층 구조 : 클래스 로더는 계층 구조로 이루어져 있고, 상위 클래스 로더의 클래스는 하위 클래스에서 볼 수 있지만 그 반대는 불가능하다
  • 위임 모델 : 클래스 로더는 실행 엔진으로 부터 로드 요청을 받으면 위에 부모 클래스 로더에 클래스 로딩 요청을 보낸다.

클래스 로더의 로딩 과정

로딩 → 링킹 → 초기화 과정을 거친다.

로딩

해당 바이트코드를 찾은 후 JVM의 메소드 영역에 구성하는 것 로딩할 때 부모 클래스가 존재한다면 부모 클래스 먼저 로딩을 진행한다. (즉, 부모 클래스 먼저 초기화 한다.)

링크

링크는 검증 준비 분석 3가지 과정을 거친다.

  • 검증 : JVM 문법에 맞는지 검증
  • 준비 : 정적 필드를 각 유형의 기본값으로 초기화하는 과정
  • 분석 : 클래스의 런타임 상수 풀 안에 있는 심볼릭 참조를 물리 주소로 변환

초기화

클래스 초기화 함수를 실행한다. 클래스에 작성된 static 초기화 함수를 모두 합쳐 한꺼번에 실행한다. 초기화 과정은 로딩-검증-준비 과정이 모두 끝났을 때 한번만 실행된다.

'JAVA > JVM' 카테고리의 다른 글

JVM 가비지 컬렉터(GC) 기초  (0) 2024.08.25
JVM 메모리 구조  (0) 2024.08.13
JVM 이란?  (0) 2024.08.13