클래스 로딩 프로세스: 1. 로딩 단계, 2. 검증 단계, 3. 주로 메모리를 할당하고 메소드 영역에서 클래스 변수를 초기화하는 단계, 5. 초기화 단계, 컴파일러는 정적 할당을 수행합니다. 클래스 파일에 선언된 변수와 정적 영역은 병합되어 cinit 메소드를 생성하고 호출됩니다. 6. 단계를 사용하십시오.
이 튜토리얼의 운영 환경: windows7 시스템, java8 버전, DELL G3 컴퓨터.
JVM의 클래스 로딩 프로세스를 이해하려면 주로 두 가지 질문에 답해야 합니다.
1 클래스는 언제 로드됩니까?
2. 클래스 로드 방법.
1. 클래스 로딩 조건:
클래스 로딩 과정은 크게 로딩, 검증, 준비, 파싱, 초기화, 사용, 언로딩, 검증, 준비, JVM은 초기화 및 언로드의 5가지 프로세스 순서를 엄격히 준수해야 하며 JVM에서는 클래스 로딩 시점을 규정하지 않지만 5가지 상황에서 클래스가 자연스럽게 초기화되어야 한다고 엄격하게 규정합니다. 이것. .
1. new, getstatic, putstatic 및 Invokestatic 네 가지 명령이 발생하면 클래스가 초기화되지 않은 경우 클래스가 먼저 초기화됩니다.
2. java.lang.reflect 패키지의 메소드를 사용하여 클래스에 대한 반사 호출을 수행할 때 클래스가 초기화되지 않은 경우 해당 초기화가 트리거됩니다.
3. 클래스를 초기화할 때 해당 클래스의 상위 클래스가 초기화되지 않은 경우 해당 상위 클래스의 초기화가 먼저 트리거됩니다.
4. JVM을 실행하려면 기본 메서드가 포함된 기본 클래스를 지정해야 합니다. 가상 머신은 이 클래스를 먼저 초기화합니다.
5. Jdk1.7의 동적 언어 지원을 사용할 때 java.lang.invoke.MethodHandle 인스턴스의 최종 구문 분석 결과가 REF_getstatic, REF_putstatic, REF_inokestatic의 메소드 핸들이고 이 메소드 핸들에 해당하는 클래스가 초기화되지 않은 경우 이 클래스의 초기화를 트리거합니다.
2. 클래스 로딩 과정
클래스 로딩 과정은 크게 로딩, 검증, 준비, 파싱, 초기화, 사용, 언로딩의 7단계로 나누어집니다.
1. 로딩:
1) 정규화된 이름을 통해 클래스에 해당하는 바이너리 바이트 스트림을 로드합니다. 주로 클래스 로더를 통해 구현됩니다.
2) 바이트 스트림으로 표현되는 정적 저장 구조를 메소드 영역의 런타임 데이터 구조로 변환합니다.
3) 메모리에 이 클래스를 나타내는 java.lang.Class 객체를 생성합니다. 이 객체는 이 클래스에 액세스하기 위한 메소드 영역의 각 클래스에 대한 입구 역할을 합니다. (핫스팟은 메서드 영역에서 이 클래스를 생성합니다).
2. 확인:
1), 파일 형식 확인: 클래스 파일의 매직 버전 번호 상수가 현재 가상 머신에서 지원하는 범위 내에 있는지 확인합니다.
2), 메타데이터 검증: 클래스의 의미 정보가 Java 언어 사양의 요구 사항을 충족하는지 확인합니다.
3), 바이트코드 확인: 프로그램 의미 체계가 합법적이고 규정을 준수하는지 확인합니다. 주로 stackmapframe 구조를 통해.
4) 기호 참조 검증: 가상 머신은 기호 참조를 직접 참조로 변환하고 기호 참조의 정규화된 이름으로 표시되는 클래스를 찾을 수 있는지, 해당 도메인 및 메서드를 찾을 수 있는지, 액세스 권한이 합법적입니다.
3. 준비:
준비 단계에서는 주로 메소드 영역의 클래스 변수(정적 수정자로 수정됨)에 대한 메모리를 할당하고 초기화합니다.
데이터 유형 | 제로 값 | 데이터 유형 | 제로 값 |
---|---|---|---|
int | 0 | boolean | false |
긴 | 0L | float | 0.0f |
short | 0 | double | 0.0d |
char | 'u0000' | reference | null |
byte | 0 |
4. 구문 분석:
1) 클래스 또는 인터페이스 구문 분석: 적합 참조를 클래스에 대한 직접 참조로 변환하고 액세스 권한을 확인합니다.
2) 필드 파싱: 필드의 기호 참조를 해당 필드가 속한 클래스 정보로 변환하거나 해당 상위 클래스의 필드에 대한 직접 참조로 변환하고 액세스 권한을 확인합니다.
3) 클래스 메소드 구문 분석: 클래스 메소드의 기호 참조를 클래스 메소드가 속한 클래스 정보 또는 상위 클래스의 필드에 대한 직접 참조로 변환하고 액세스 권한을 확인합니다.
4) 인터페이스 메소드 구문 분석: 인터페이스 메소드의 심볼릭 참조를 인터페이스 메소드가 속한 인터페이스 정보 또는 상위 클래스의 필드에 대한 직접 참조로 변환하고 액세스 권한을 확인합니다.
5. 초기화:
초기화 단계에서 컴파일러는 클래스 파일에 선언된 정적 할당 변수와 정적 영역을 병합하여
클래스 로더: 클래스 로더는 "완전한 자격을 갖춘 이름을 통해 클래스의 바이너리 바이트 스트림을 로드"하는 구현입니다. 모든 클래스는 가상 고유성에서 클래스 로더와 클래스 자체에 의해 공동으로 결정됩니다. 기계.
부모 위임 모델:
1. Bootstrap ClassLoader는 클래스 로더를 시작하고
2. 확장 클래스 ClassLoader는 클래스 로더를 확장하고 로드를 담당합니다.
3. 애플리케이션 클래스 로더 애플리케이션 클래스 로더는 CLASSPATH 경로 아래에 JAVA 클래스 라이브러리를 로드하는 역할을 합니다.
4. 사용자 ClassLoader 사용자 정의 클래스 로더.
상위 위임 모델은 클래스를 로드하는 방식으로 클래스를 로드합니다. 클래스 로더가 클래스 로드 요청을 받으면 먼저 상위 클래스를 위임하여 클래스를 로드합니다. 따라서 모든 클래스 로드 요청은 해당 클래스에 도달합니다. 최상위 상위 클래스, 상위 클래스를 로드할 수 없는 경우 이 클래스 로더를 사용하여 로드합니다. 이러한 방식으로 클래스 로더 사이에는 계층적 관계가 존재하며, 이는 Java의 기본 클래스가 동일한 클래스 로더에 의해 로드되도록 보장할 수 있으며 이는 Java 시스템의 안정성에 중요한 역할을 합니다.
추천 관련 비디오 튜토리얼: Java 비디오 튜토리얼
위 내용은 JVM 클래스 로딩 프로세스의 단계는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!