[java] classloader 에 대해

sonnie
lucky-sonnie
Published in
3 min readJul 15, 2020

classloader란 abstract class byteCode를 읽어들여서 class 객체를 생성하는 역할을 담당한다. 클래스 로더 시스템은 로딩, 링크, 초기화로 이루어져 있고 로딩→ 링크→ 초기화 순으로 진행된다.

로딩(loading)

클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만든다. 그 데이터를 메모리의 “메소드” 영역에 저장한다.

이때, 메소드 영역에 저장하는 데이터는 FQCN(Fully Qualified Class Name: 클래스가 속한 패키지명을 모두 포함한 이름), Class, interface, enum, method와 변수다. 로딩이 끝나면 해당 클래스 타입의 class 객체를 생성해서 ‘힙’ 영역에 저장한다.

  • bootstrap classloader: JAVA_HOME\lib에 있는 코어 자바 API를 제공한다. 최상위 우선순위를 가진 클래스 로더.
  • platform classloader: JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
  • application classloader: application classpath(application 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽는다.
클래스 로더를 콘솔에 찍어보기

클래스 로더를 읽어와 달라고 요청하면 맨 처음에는 제일 위에 있는 부모로 요청이 간다. 부모가 못읽어 오면 그 다음 부모로 간다. 그래도 안되면 본인이 읽는다. 만약 본인도 못 읽어오면 ClassNotFoundException이 발생한다.

링크(linking)

verify → prepare → resolve 순서로 실행된다.

  • Verify : .class 파일 형식이 유효한지 체크한다. 파일이 유효하지 않으면 JVM 에러가 난다.
  • Prepare: 클래스 변수(static 변수)와 기본값에 필요한 메모리를 준비하는 과정이다.
  • Resolve: 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다. (Optional)

위의 book에 대한 reference는 링크하는 과정에서 symbolic memory reference이다. 실제 레퍼런스를 가리키고 있지는 않다는 뜻이다. 실제 힙에 들어있는 Book 인스턴스를 가리키도록 교체하는 과정을 resolve라고 한다.

초기화(initialization)

링크의 preparation 과정에서 준비된 메모리에 static 변수의 값을 할당한다. (static 블럭이 있다면 이때 실행된다.)

참조:

인프런 강좌 “더 자바, 코드를 조작하는 다양한 방법”

--

--