클래스 로더는 바이트코드 파일을 동적 로딩한다.
JVM메모리에 클래스 정보를 실행 엔진이 사용할 수 있게 적재하는 역할을 한다.
로딩, 링크, 초기화의 과정을 거친다.
💡 JVM은 메모리를 효율적으로 관리하기 위해서 실행될 때 필요한 클래스 파일만 메모리에 올려둔다.
로딩, 링크, 초기화 과정을 거친다.
로드: 바이트 코드 파일을 JVM의 메모리에 로드한다
링크: 클래스 파일을 사용하기위해 검증한다
초기화: 클래스 변수들을 적절한 값으로 초기화 한다.
바이트 코드 파일을 바탕으로 JVM 메서드 영역에 로드한다.
메서드와 변수 그리고 Class, Interface , Enum 을 구분해서 저장한다.
로딩이 끝나면 해당 클래스 타입의 객체를 생성하여 메모리의 Heap 영역에 저장한다.동적로딩
클래스 로더의 로딩은 동적으로 이루어진다.
즉 한번에 모두 메모리에 올리는 것이 아닌, 필요할때만 동적으로 메모리에 로드한다.
바이트 코드에 어떤 클래스가 있다고 하더라도, 사용하지 않는다면 로드되지 않는다.규칙
- 부모 객체가 있는 클래스라면 부모 객체먼저 로드를 한다.
- Static 변수를 호출할 때 그 클래스를 로드한다.
- 자식 클래스를 호출할 때 그 부모 클래스 먼저 로드한다.
- 내부 클래스를 호출하면 외부 클래스를 로드한다.
- staitc 내부 클래스 호출을 하면 그 내부 클래스만 로드한다.
- static 내부 클래스의 static변수를 호출하면 static 내부 클래스만 로드한다.
- static final 변수가 있으면 이를 가지는 클래스를 로드하지 않는다.
로드하지 않는 이유는 상수는 JVM의 Constant Pool에 따로 저장되어 관리되기 때문이다.
클래스 파일을 사용하기 위해 검증하는 단계이다.
검증(Verify)
클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 구성되어있는지 검사한다. 실패한다면 런타임 에러(java.lamg.VerifyError)를 띄운다.
검증된 컴파일러가 만든 바이트코드가 아니거나 제3자가 수동으로 변경을 했을 경우에도 검증에 실패하기 때문에 악의적인 변경을 방지한다.
준비(Prerpare)
메모리를 할당하고 static필드가 기본값으로 초기화 된다.
클래스가 필요로 하는 메모리를 할당하고, 클래스의 필드, 메서드, 인터페이스를 나타내는 데이터 구조를 준비한다.분석(Resolve)
클래스의 상수 풀 내의 모든 심볼릭 레퍼런스를 실제 메모리 레퍼런스로 교체한다.
심볼릭 레퍼런스: 메모리 번지가 아닌 이름에 의한 참조
링크 단계에서 확보한 메모리 영역에 클래스의 statitc 변수를 명시된 값으로 할당한다.
reference
https://velog.io/@skyepodium/클래스는-언제-로딩되고-초기화되는가#1-가이드
https://inkyu-yoon.github.io/docs/Language/Java/ClassLoader
https://inpa.tistory.com/entry/JAVA-☕-클래스는-언제-메모리에-로딩-초기화-되는가-❓