devlog

Class Loader : 자바 바이트 코드를 메모리에 올린다 본문

프로그래밍언어/Java

Class Loader : 자바 바이트 코드를 메모리에 올린다

Dev-SeeOne 2020. 8. 9. 20:37

Class Loader System

클래스 로더는 로딩, 링크, 초기화의 과정을 수행한다.

Loading

  • 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 메소드 영역 에 저장한다.
  • 메소드 영역 에 저장되는 데이터
    • FQCN(Fully Qualified Class Name) : 클래스가 속한 패키지명을 모두 포함한 이름 ex) java.lang.String
    • Class, Interface, Enum 과 같은 속성정보
    • 메소드와 변수
  • 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여  영역에 저장한다. 때문에 App.class 처럼 사용가능

 

Linking

  • 링크는 Verify, Prepare, Resolve(Optional) 세 단계로 나누어져 있다.
  • Verify : .class 파일의 형식이 유효한지 체크한다.
  • Prepare : static 변수와 기본값에 필요한 메모리를 준비하는 과정
  • Resolve : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다. 이 과정은 Optional 이므로 지금 수행할 수도 있고 나중에 수행될 수도 있다.
public Book { }

public App { 
	Book book = new Book(); 
}

위의 코드 처럼 App 클래스에서 Book 클래스를 참조한다고 실제 메소드 영역에 있는 레퍼런스가 연결되어 있는 것이 아니라 논리적인 레퍼런스로 연결되어있다. 이를 실제 레퍼런스로 교체하는 것이 Resolve 과정이다.

Initialization

  • static 변수의 값을 할당한다. static 블록이 존재하면 이 때 실행된다.

 

Class Loader

클래스 로더는 계층 구조로 이루어져 있으며 기본적으로 세 가지 클래스 로더가 제공된다.

Bootstrap Class Loader

  • 최상위 부모 클래스로더로 가장 높은 우선순위를 가지고 있다.
  • JAVA_HOME\lib 에 있는 코어 자바 API를 제공한다.

Platform Class Loader

  • JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.

Application Class Loader

  • 애플리케이션 클래스 패스에서 클래스를 읽는다.

최상위 부모 클래스인 부트스트랩 클래스 로더부터 애플리케이션 클래스 로더 순으로 클래스를 읽고 최종적으로 애플리케이션 클래스로더도 읽기를 시도했을 때 해당 클래스를 찾지 못했을 경우 ClassNotFoundExcepion 이 발생한다. ex) 의존성을 제대로 추가하지 않은 경우

public class App { 
    public static void main( String[] args ) { 
        ClassLoader classLoader = App.class.getClassLoader(); 
        System.out.println(classLoader); 
        System.out.println(classLoader.getParent()); 
        System.out.println(classLoader.getParent().getParent()); 
    } 
}

위의 코드를 실행하면 아래와 같은 결과를 얻을 수 있다.

sun.misc.Launcher$AppClassLoader@18b4aac2 
sun.misc.Launcher$ExtClassLoader@6d6f6e28 
null

현재 클래스로더를 출력하면 Application 클래스 로더가 그 부모를 출력하면 Platform 클래스 로더가 출력되는데 그 부모인 Bootstrap 클래스 로더는 출력되지 않고 null 값이 출력된다.

그 이유는 Bootstrap 클래스 로더 는 네이티브 코드로 구현되어 있기 때문에 자바에서 참조해서 호출이 불가능하기 때문이다.

Comments