[Java] JVM 이해하기 - 클래스 로더

YulHee Kim·2021년 12월 19일
0

Java

목록 보기
6/8
post-thumbnail

백기선님의 더 자바, 코드를 조작하는 다양한 방법을 수강한 후 정리해보았습니다.

[JVM 이해하기]

저번 시간에 간단하게 정리해본 JVM 아키텍처에서 클래스 로더를 좀 더 자세히 알아보겠습니다.

💡 클래스 로더

  • 로딩, 링크, 초기화 순으로 진행됩니다.
  • 로딩
    • 여러 개의 클래스 로더들이 부모 자식 관계를 맺고 로딩을 합니다.

    • 클래스 로더가 .class 파일을 읽고 적절한 바이너리 파일을 만들어서 '메소드' 영역에 클래스 정보를 저장합니다.

    • 이 클래스 정보는(메소드 영역에 저장하는 데이터) 다음과 같습니다.

      • FQCN (Fully Qualified Class Name)
      • Type 정보 (클래스 | 인터페이스 | Enum)
      • 메소드와 변수
    • 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 '힙' 영역에 저장합니다.

    • 여러개의 클래스 로더가 있습니다.

      - 부트 스트랩 클래스 로더 : JAVA_HOME\lib에 있는 코어 자바 API를 제공하며, 최상위 우선순위를 가진 클래스 로더입니다.
      - 플랫폼 클래스 로더 : JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽습니다.
      - 애플리케이션 클래스 로더 : 애플리케이션 클래스패스(애플리케이션을 실행할 때 주는 classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽습니다.

      코드로 클래스 로더를 확인해보자면, 클래스 로더는 계층형 구조입니다.

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

      현재 App이라는 class의 클래스 로더는 AppClassLoader(애플리케이션 클래스로더)입니다. 애플리케이션 클래스 로더의 부모 로더는 플랫폼 클래스 로더입니다.

      즉, 저희가 작성한 코드들의 대부분은 애플리케이션 클래스 로더가 읽습니다. 만약 부모 클래스 로더가 못읽고 애플리케이션 클래스 로더 본인도 못읽는다면, 코드는 class not found Error가 발생하게되는 것입니다.

  • 링크
    • 링크는 Verify, Prepare, Resolve(optional) 세 단계로 나뉩니다.
    • Verify(검증) : 읽어들이는 .class 파일이 유효한지 체크합니다.
    • Preparation : 메모리를 준비하는 과정입니다. 클래스 변수(static 변수)와 기본값에 필요한 메모리를 준비하는 과정입니다.
    • Resolve(optional) : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체하는 것입니다. 이 과정은 옵셔널합니다.
  • 초기화
    • Static 변수의 값을 할당합니다. (static 변수, 블럭이 있다면 이때 실행됩니다.)

JVM에서 가장 중요한 것은 바로 바이트코드입니다. 다음은 바이트코드에 대해 정리해보겠습니다.

profile
백엔드 개발자

0개의 댓글