ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JVM] 클래스 로더
    📖 개발 공부/jvm 2023. 1. 30. 00:46

    클래스 로더

    https://www.scientecheasy.com/2021/03/what-is-jvm.html/

     

    클래스 로더가 JVM 메모리에 바이트 코드를 업로드 시키고, 실행 엔진이 여기에 있는 바이트 코드들을 실행하게 된다.

    클래스들을 한번에 메모리 올리지 않음 (낭비 될 수 있어서)

    그때그때 필요한 것들만 클래스 로더가 가져와서 메모리에 올림. 실행엔진이 실행하다가 클래스가 없다 → 클래스 로더에게 요청, 클래스 로더는 클래스를 로드하게 된다.

    클래스를 로드하는 과정

    클래스 로드의 3가지 단계

    • Loading: 클래스 파일로부터 읽어와서 JVM 메모리에 로딩하는 과정
      • 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 Method 영역에 저장한다.
      • Method 영역에 저장되는 데이터 (클래스 파일의 바이트 코드가 로드되는 곳)
        • 타입 정보 (클래스, 인터페이스, enum)
        • 메서드와 변수 정보
        • FQCN
      • 로딩을 하고 나면 해당 클래스 타입의 Class<?> 객체(클래스 객체)를 생성하여 힙 영역에 저장한다.
      • 객체이름.class 또는 인스턴스의 getClass() 형태로 호출했을 때 리턴되는 값
    • Linking: 클래스 파일을 검증, 기본값으로 초기화하는 과정
      • Verify(검증): 클래스 파일이 유효한지 확인(=컴파일이 잘 되었는지), JVM 구동 조건대로 구현되지 않았을 경우 VerifyError를 던진다.
      • Prepare(준비):
        • 클래스가 필요로 한 메모리를 준비해두는 과정
        • 클래스 및 인터페이스에 필요한 static field 메모리를 할당하고, 이를 기본값으로 초기화한다.
          • 기본값으로 초기화된 static field 값들은 뒤의 Initialization 과정에서 코드에 작성한 초기값으로 변경이 된다.
            → 이 때문에 JVM에 탑재된 클래스 파일의 코드를 작동시키진 않는다.
      • Resolve(분석):
        • 클래스가 참조하는 객체에 대해 실제 메모리 주소값을 대입하는 과정
        • 런타임 상수 풀(run-time constant pool)에 있는 심볼릭 참조(symbolic reference - 논리적 주소)를 직접 참조(direct reference - 실제 메모리 주소)로 대체하는 과정
        • 여기서 심볼릭 메모리 레퍼런스는 클래스가 로드가 되면 실제 힙영역의 레퍼런스 영역을 가르키는 것이 아니라 논리적인 주소만 가르키고 있는 것을 뜻한다. 이것을 Resolve 단계에서 실제 힙 영역의 레퍼런스를 가르키게 한다.
        • 참고: JVM. 클래스로더 서브시스템(Class Loader Subsystem)
    • Initializing(초기화): 클래스 안에 static 변수의 값을 할당하고 초기화시키는 과정
      • 앞의 prepare 단계에서 확보된 메모리 영역에 클래스의 static 값들을 할당한다. (실제 코드에 명시된 초기화값)
    static final String name = "name";

    클래스 로더의 종류

    3가지 단계로 동작

    1. 캐시에서 확인: 이미 불러온 클래스가 있는지 확인한다. (이전에 로드된 클래스인지)
    2. 상위 클래스 로더에서 확인
    3. 본인 클래스 로더에서 확인

    클래스 로더 위계

    • Bootstrap에 존재하는지: 가장 먼저 실행되는 클래스 로더, 자바의 기본적인 클래스들을 로드한다.
    • 없다면 Extension에 존재하는지: 자바 기본 클래스들을 제외한 확장된 클래스들을 로드한다.
    • 없다면 Application(System)에 존재하는지: java를 실행하면서 classpath 옵션을 주었을 때 여기에 있는 클래스들을 로드한다.
    • User-Defined: 우리가 직접 생성한 클래스 로더

    일반적으로 99%는 Application에 존재한다.

     

    반응형

    댓글

Designed by Tistory.