JVM (1) 급 로더 및 클래스 로딩 프로세스

1.1 전체 구조도

여기에 사진 설명 삽입

1.2 클래스 로더 하위 시스템의 역할

클래스 1 특정 파일 식별을 사용하여 파일 시작 부분에있는 클래스 파일 인 파일 시스템 에서 클래스 파일로드하는 하위 시스템 을로드 합니다.
2 ClassLoader는 클래스 파일로드 만 담당합니다.
3로드 된 클래스 정보는 메소드 영역 의 메모리 공간에 저장됩니다 .
방법 영역의 개념 :

存放运行时常量池信息:{
    
    
字符串的字面变量,数字常量}

1.3 ClassLoader 역할의 역할

여기에 사진 설명 삽입
1 [Car.class] 클래스 파일이 로컬 디스크에 저장 됨
2 클래스 파일이 JVM 메소드 영역에로드 됨
Step 1 ——— (Transporter : ClassLoader) ————> Step 2

1.4 클래스 로딩 프로세스

여기에 사진 설명 삽입

1.4.1 로딩

1 클래스의 완전한 이름을 통해이 클래스정의 하는 2 진 바이트 스트림 을 확보 하십시오. 2
바이트 스트림나타내는 정적 스토리지 구조를 메소드 영역의 런타임 데이터 구조 로 변환 하십시오.
3 메모리 .lang 에서이 클래스를 나타내는 Java를 생성하십시오 . 메소드 영역에서이 클래스의 다양한 데이터에 대한 액세스 항목으로서 클래스 객체 [반사 메커니즘]

1.4.2 연결

1 검증 :
클래스 파일의 바이트 스트림에 포함 된 정보가 현재 가상 머신의 요구 사항을 충족하는지 확인하고 클래스 로딩의 정확성을 확인합니다.
2 준비 (준비) :
클래스 변수에 대한 메모리 할당 및 클래스 변수의 기본 초기 값 설정 [0]

注意:
这里不包括final修饰的static,因为final在编译的时候就会被分配了,准备阶段会显示的初始化。
这里也不会为实例变量分配内存,实例变量会随着对象一起分配到java heap中

3 해결 :
상수 풀의 기호 참조를 직접 참조로 변환하는 프로세스입니다.

1.4.3 초기화 (초기화)

초기화클래스 생성자 메서드 <clinit> () 를 실행하는 프로세스입니다 .

javac 컴파일러는 클래스 에있는 모든 클래스 변수의 할당 작업 을 자동으로 수집 하여 정적 코드 블록의 명령문병합합니다.

클래스에 상위 클래스가있는 경우 JVM은 하위 클래스의 <clinit> ()가 실행되기 전에 상위 클래스의 <clinit> ()가 실행되는지 확인합니다.

데모
여기에 사진 설명 삽입
노트 : a
의 할당 프로세스 :
1 연결 준비 단계 : a = 0;
2 clinit 단계 : a = 1

1.5 클래스 로더 분류

따르면 클래스 로더 상속 있는지의 여부된다 으로 나누었다 . 부트 클래스 로더 및 사용자 클래스 로더
상부층과 하부층 사이의 관계 :
여기에 사진 설명 삽입

1.5.1 부트 스트랩 클래스 로더 (Bootstrap ClassLoader)

1 사용 된 C / C ++ 언어
2 java javax sun으로 시작하는 Java 코어 라이브러리 클래스로드
3 상위 로더 없음
4 직접 가져올 수 없음

1.5.2 확장 클래스 로더

1Java 언어 작성 2
추상 클래스 ClassLoader 상속 3
부모 로더는 시작 클래스 로더입니다.

1.5.3 시스템 클래스 로더 (AppClassLoader)

2Inheriting 작성 1Java 언어
클래스 로더 3The의
부모 로더는 확장 클래스 로더 4The
프로그램의 기본 클래스 로더

시스템 클래스 로더 데모를 부트 클래스 로더로 확장
여기에 사진 설명 삽입

1.5.4 커스텀 클래스 로더

의의 :
로딩 클래스 분리 클래스
의 로딩 메소드 수정
로딩 소스 확장
소스 코드 유출 방지
구현 단계 :
1 java.lang.ClassLoader 클래스 상속
2 findClass () 메소드 다시 작성
데모
여기에 사진 설명 삽입

1.6 클래스 로더

여기에 사진 설명 삽입ClassLoader를 얻는 방법
여기에 사진 설명 삽입

1.7 부모 위임 메커니즘 (인터뷰 초점)

JVM 은 요청에 따라 클래스 파일 을로드 합니다 . 특정 클래스의 클래스 파일을 로드 할 때 JVM은 상위 위임 메커니즘을 사용합니다 . 즉, 요청이 처리를 위해 상위 클래스로 넘겨집니다.

1.7.1 작동 원리

여기에 사진 설명 삽입
데모
여기에 사진 설명 삽입
java.lang.String 클래스는 부트 클래스 로더에 의해로드되는 핵심 Java 클래스이지만 원래 javaAPI에는 기본 메소드가 없습니다. 따라서 상위 위임 메커니즘의 장점 인 프로그램 보안을 보호하고 핵심 API가 변조되는 것을 방지합니다.

여기에 사진 설명 삽입

1.8 기타 중요한 지식 포인트

두 개의 클래스 객체가 동일한 클래스에 존재하는지 여부를 판단하는 데 필요한 두 가지 조건
1 패키지 이름을 포함하여 클래스의 전체 클래스 이름이 동일해야합니다.
2이 클래스를로드하는 ClassLoader는 동일해야합니다.


클래스 의 능동적 및 수동적 사용 으로 인해 클래스 초기화가 분류의 기초가됩니까?

추천

출처blog.csdn.net/zs18753479279/article/details/111028833