Java

Class Loader의 역할과 동작 방식

딱구킴 2022. 10. 20. 16:45

이 글에서는 클래스로더의 역할과 동작 방식을 알아보고자 합니다.

 

클래스로더는 .class 파일을 JVM으로 로딩시켜주는 역할 이외에도, 여러 역할을 수행합니다.

 

클래스로더의 동작 방식은 로딩 -> 링크 -> 초기화 순서로 동작합니다.

로딩

  • 클래스 로더가 .class 파일을 읽고 적절한 바이너리 데이터를 만듭니다.
  • 만든 바이너리 데이터를 "메소드" 영역에 저장합니다.
  • 메소드 영역에는 아래와 같은 데이터를 저장합니다.
    • FQCN (Fully Qualified Class Name) : 패키지명까지 포함된 클래스명이라고 합니다.
    • 클래스, 인터페이스, 이넘(enum)
    • 메소드, 변수
  • 로딩이 끝나게 되면, 해당 클래스 타입의 Class 객체를 생성하고 "힙 영역"에 저장합니다.

 

링크

  • 링크는 아래 세 단계로 나눠져 있습니다.
    • Verify : .class 파일이 유효한지 체크하는 단계입니다.
    • Prepare : static 변수와 기본 값에 필요한 메모리를 준비하여 할당합니다. (메모리 준비 과정)
    • Resolve(Optional) : SymbolicMemoryReference를 실제 레퍼런스로 교체합니다. 
  • Resolve 추가 설명
    • 아래의 참조는, 링크 과정에서는 "Symbolic reference"형태로 관리됩니다.
    • 이는 논리적 레퍼런스로, 실제 레퍼런스를 갖고있지 않은 상태를 의미합니다.
    • Resolve 과정을 거치면 Symbolic reference는 실제 레퍼런스로 교체됩니다. 
    • 하지만, 이는 Optional 과정으로, 링크 과정에서 교체될 수도 있고, 이후의 과정에서 교체될 수도 있습니다.
SymbolicReference symbolicReference = new SymbolicReference();

 

초기화

  • static 변수의 값을 할당합니다.
  • static 블럭이 있을 경우, 이 때 실행됩니다.

 

출처

https://www.inflearn.com/course/the-java-code-manipulation/dashboard