JVM - ClassLoader

현시기얌·2022년 2월 21일
0

JVM

목록 보기
3/3
post-custom-banner

클래스 로더

  • 로딩하는 과정에 여러개의 ClassLoader들이 부모 자식 관계를 맺고 로딩을 한다.
  • 링크과정 또한 3단계로 나뉘어져서 순차적으로 진행이 된다.
  • 최종적으로 초기화가 진행된다.
  • 로딩, 링크, 초기화 순으로 진행된다.

로딩

  • 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 메소드 영역에 클래스 정보를 저장한다.
  • 이 때 메소드 영역에 저장하는 데이터
    • FQCN(Fully Qualify Class Name : 패키지 경로까지 포함한 클래스 이름)
    • Class, Interface, Enum
    • 메소드와 변수
  • 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 영역에 저장한다.

클래스 로더의 종류

  • Bootstrap 클래스 로더 : JAVA_HOME/lib에 있는 코어 자바 API를 제공한다. 최상위 우선순위를 가진 클래스 로더
  • Platform(Extension) 클래스 로더 : JAVA_HOME/lib/ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
  • Application 클래스 로더 : 애플리케이션 클래스패스(애플리케이션이 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽는다.

  • 제일 먼저 Application ClassLoader가 있다.
  • Application ClassLoader의 부모로 Platform ClassLoader가 있다.
  • BootStrap Class Loader는 Native코드로 되어있기 때문에 null값으로 표현된다.

Class Loader 동작 방식

  1. 어떤 Class를 읽어달라고 하면 제일 부모인 Bootstrap Class Loader에게 부탁한다.
  2. 만약 Bootstrap Class Loader가 읽어오지못하면 Platform Class Loader가 읽어오고 Platform Class Loader가 읽지 못하면 Application Class Loader가 읽어온다.
  3. 만약 Application Class Loader 또한 읽지 못한다면 ClassNotFoundException이 발생한다.

링크

  • Verify, Prepare, Resolve(optional) 세 단계로 나뉘어져 있다.

  • Verify : .class 파일 형식이 유효한지 체크한다.

  • Prepare : 클래스 변수(static 변수)와 기본값에 필요한 메모리를 준비해두는 과정이다.

  • Resolve : 심볼릭 메모리 레퍼런스( Book book = new Book() )를 메소드 영역에 있는 실제 레퍼런스로 교체한다. (Optional)

초기화

  • static 변수의 값을 할당한다. (static 블록이 있다면 이 때 실행된다.)
static String hello = "Hello";
static String name;

static {
    name = "hyunsik"
}
profile
현시깁니다
post-custom-banner

0개의 댓글