클래스 로더 서브 시스템

클래스 로더

역할 클래스 로더 - 택배
进入JVM
加载并初始化
实例化
实例化
实例化
Car.class
ClassLoader
Car class
car 1
car 2
car 3
분류 클래스 로더
JVM支持的类加载器
引导类加载器 Bootstrap ClassLoader
自定义类加载器 User-Defined ClassLoader

추상 클래스 클래스 로더 로더 유무는 사용자 정의 클래스 로더가 보내 년생.

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 직접 업로드 아래 그림을 저장하는 것이 좋습니다 (IMG-KRDpyB3F-1581505064618) (EN-자원 : // / 2941 데이터베이스 : 1)]

  • 부트 클래스 로더 (부트 스트랩 클래스 로더 부트 스트랩 클래스 로더)
    • 는 C ++ 언어의 JVM 내부의 둥지.
    • 자바 코어 라이브러리를로드하는 데 사용, JVM 클래스는 자신의 필요에 따라 제공합니다.
    • 에서 상속하지 java.lang.ClassLoader없이 부모 클래스 로더.
    • 클래스와 응용 프로그램 클래스 로더를 확장로드, 부모 클래스 로더에 할당합니다.
    • 부하에 부트 스트랩 시작 클래스 로더 단지 java, javax, sun등 클래스의 시작,
  • 확장 클래스 로더 (증축 클래스 로더)
    • 자바로 작성된, 파생 클래스의 클래스 로더
    • 부팅에 부모 클래스 로더 클래스 로더
    • jre / lib / ext 디렉토리에있는 라이브러리를로드하면이 디렉토리에있는 사용자 정의 라이브러리되면로드 될
  • 시스템 클래스 로더 (응용 프로그램 클래스 로더, AppClassLoader)
    • 클래스 로더는 확장 클래스 로더 클래스, 부모 클래스 로더를 도출
    • 로딩 환경 변수에 대한 책임 classpath이나 시스템 속성을 java.class.path지정된 경로에 라이브러리

클래스를로드

加载
链接
初始化
1.로드

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 직접 업로드 아래 그림을 저장하는 것이 좋습니다 (IMG-XFUt0lPH-1581505064639) (EN-자원 : // / 2939 데이터베이스 : 1)]

  • 전체 바이너리 바이트 스트림에 의해 정의 된 클래스의 클래스 이름을 얻으려면
  • 정적 저장 구조는 메소드 영역 런타임 데이터 구조로 바이트 스트림으로 표현
  • 메모리에 이러한 종류의 대표 생성 java.lang.Class클래스의 입구의 데이터 액세스 영역의 다양한 방법으로, 개체

PS : 부하 .class논문

  1. 로컬 시스템에서 직접로드
  2. 예를 들어, 네트워크, 웹 애플릿을 통해 사용 가능
  3. 이러한 파일 항아리 또는 전쟁으로 압축 읽기
  4. 계산하여 실행 시간, 예를 들어, 동적 프록시를 생성
  5. 에 의해 생성 된 다른 문서, 예를 들어, JSP 응용 프로그램
2. 링크
  • (확인) 확인 
    하기 위해 그 결과 java.lang.Class가상 머신의 요구 사항을 만족하는 개체. 상기 상징적 참조의 검증 파일 포맷, 메타 데이터 유효성 검사, 바이트 코드 검증, 검증을.

  • 준비 (준비)

    • 클래스 변수를 메모리에 할당하고, 설정 초기 클래스 변수, 즉, 0 값의 기본값 .
    • 컴파일시 준비의 마지막 단계가 명시 적으로 초기화가 할당 된 것이기 때문에 여기가 정적 최종 수정을 포함하지 않습니다,
    • 아니 인스턴스 변수 할당 초기화 클래스 변수는 프로세스 영역에 할당인스턴스 변수는 힙에 할당 한다.
  • 구문 분석 (해결)

    • 부호 직접 참조로 상수 풀
3. 초기화
  • 초기화 단계 방법은 구현 클래스의 생성자입니다 <clinit>()절차
  • 이 방법은 자동으로 모든 클래스와 코드 블록에서 명령문의 정적 변수를 수집 결합 javac의 컴파일러 클래스를 지정하는 경우로 정의를 필요로하지 않습니다.
  • 생성자 방법 문은에서 소스 파일에 지침의 순서로 나타납니다
  • <clinit>() 클래스 생성자와 달리, 각 JVM을 보는 클래스 생성자를 보는 것은 <init>()
  • 가상 머신이 클래스 있는지 확인해야합니다 <clinit>()방법은 다중 스레드에 잠겨 동기화

부모 위임 메커니즘

수요에로드 된 자바 가상 머신 클래스의 사용 파일은 클래스가 메모리에 생성 된 객체에로드되는 클래스 파일 형식을 사용해야합니다 때 방법입니다.
부모 위임 모델, 부모 프로세스, 즉 작업을 사용하여 클래스 파일의 클래스를로드 할 때.

원칙
  1. 클래스 로더가로드하는 클래스가 요청을받은 경우, 그것은 자신의 부하로 이동되지 않지만 수행 할 수있는 부모 클래스 로더에 요청을 위임 할 수 있습니다.
  2. 부트 클래스 로더의 상단까지 더 위쪽으로 부모 클래스 로더의 상위 클래스 로더, 다음, 대리인이있는 경우.
  3. 부모 클래스 로더가로드 작업을 완료 할 경우 성공적으로 반환;하지 완성 로딩 작업, 자식 클래스 로더가로드하려고 시도합니다.

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 직접 업로드 아래 그림을 저장하는 것이 좋습니다 (IMG-NTLOrndR-1581505064641) ( EN-자원 : // 데이터베이스 / 2943 : 1)]
두 객체가 같은 클래스입니다 의 클래스에 대한 두 가지 필요 조건

  • 클래스의 전체 클래스 이름은 패키지 이름을 포함, 동일해야합니다.
  • 이 클래스의로드 ClassLoader 인스턴스 객체는 동일해야합니다.
우월
  • 반복 방지 부하 클래스
  • 핵심 API를 방지하기 위해 보호기 보안 수정되었습니다

SPI 인터페이스 클래스 로딩

  • 로드 인터페이스 코어의 rt.jar 부트 스트랩 클래스 로더 부하를
  • 사용하여 특정 범주 시스템 클래스 로더 ( AppClassLoader )로드

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 직접 업로드 아래 그림을 저장하는 것이 좋습니다 (IMG-UTsXdVGR-1581505064643) (EN-자원 : // / 2945 데이터베이스 : 1)]

클래스의 능동 및 수동 사용을 사용하여
활성 사용
  1. 클래스의 인스턴스를 생성
  2. 클래스 또는 인터페이스 또는 정적 변수 할당의 액세스 정적 변수
  3. 정적 메소드 호출 클래스
  4. 반사
  5. 클래스의 서브 클래스를 초기화
  6. Java 가상 머신 클래스의 시작 클래스로 분류되기 시작하면
  7. 동적 언어 지원 제공 JDK7 시작
활성 사용

이 일곱 종류 또한, 수동 사용하는 모든 클래스,하지 않습니다 클래스 초기화 원인

게시 32 개 원래 기사 · 원 찬양 7 · 전망 7567

추천

출처blog.csdn.net/Isaacddx/article/details/104283472