하나 개의 기사 클래스 로딩 메커니즘을 읽기

클래스에 따라 처리

마지막 메인 프로그램 기능을 실행 실행할 수있는 자바 패키지 항아리 패키지 컴파일 된 파일의 복수, 메인 클래스, 첫 번째 필요가 클래스 로더 JVM에 의해로드되는 메인 클래스의 자바 명령을 시작합니다.
당신이 다른 클래스를 사용하는 경우 운전 중 마스터 클래스는,이 클래스는 점진적으로로드됩니다.
참고 항아리 가방 클래스는로드 된 경우에만 사용되며, 한 번에 모든로드되지 않습니다.

다음 단계에서 사용되는 프로세스에 클래스에서로드
로드, 검증, 준비, 해상도, 초기화, 사용, 제거

  • 로드 : 찾기 및 하드 디스크에, 예를 들어, IO 바이트 코드 파일 만로드 된 클래스를 사용하여 읽 메인 클래스의 메소드 호출 등 새로운 새 개체;
  • 확인 : 체크섬 바이트 코드 파일의 정확성;
  • 제조 : 정적 변수 메모리 클래스를 할당하고 디폴트 값을 부여하는 단계;
  • 분석 : 직접 참조 대신 심볼 참조, 여분 등 (직접 견적) (예컨대 주 방법으로서 상징적 참조) 정적 메소드를 상연 될 데이터 메모리 포인터 또는이 고정 연결 과정 인 처리 위치를 가리 키도록 수업 중에 완료 설명했다. 실행 중에 완료 될 때 동적 링크는 직접 참조 기호 참조로 대체됩니다.
  • 초기화 : 값을 지정된 정적 클래스 변수를 초기화 정적 블록을 수행한다.

    클래스 로더

    상기 클래스 로딩 처리는 주로 클래스 로더, 자바에 의해 달성되며, 여러 클래스 로더있다.
  • 클래스 로더를 시작합니다 핵심 라이브러리를로드에 대한 책임이 JREd의 lib 디렉토리 JVM 실행의 낮은 금액을 지원;
  • 확장 클래스 로더 : 지원은 JRE lib 디렉토리의 JAR 확장 클래스 패키지 디렉토리 EXT있는 JVM의 실행을로드하기위한 책임이있다;
  • 응용 프로그램 로더 : 클래스 경로 경로에서 클래스를로드 패키지에 대한 책임, 기본 응용 프로그램 클래스가로드;
  • 사용자 정의 로더 : 사용자 정의 클래스 패키지 경로를로드에 대한 책임;

클래스를 설명하는 것은, java.lang.ClassLoader의 클래스를 상속 두 가지 방법이 핵심이있다, 그리고로 loadClass (때문에) findClass.

protected Class<?> loadClass(String name, boolean resolve)
    throws ClassNotFoundException
{
    synchronized (getClassLoadingLock(name)) {
        // First, check if the class has already been loaded
        Class<?> c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                if (parent != null) {
                    c = parent.loadClass(name, false);
                } else {
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                // ClassNotFoundException thrown if class not found
                // from the non-null parent class loader
            }

            if (c == null) {
                // If still not found, then invoke findClass in order
                // to find the class.
                long t1 = System.nanoTime();
                c = findClass(name);

                // this is the defining class loader; record the stats
                sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                sun.misc.PerfCounter.getFindClasses().increment();
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}

(때문에) findClass 기본 구현 방법에 슬로우됩니다, 그래서 우리는 사용자 정의 클래스 로더는 주로 (때문에) findClass 방법을 다시 작성합니다.

protected Class<?> findClass(String name) throws ClassNotFoundException {
    throw new ClassNotFoundException(name);
}

부모 위임 메커니즘

JVM 클래스 로더는 친자 층 구조이다.

이 클래스가로드 된 부모 위임 메커니즘, 클래스 기록, 처음으로 위임 부모 클래스 로더가 대상을 찾을 것입니다 때 모든 부모 로더에서 클래스를로드 한 후 자신의 경로가보고되지 않은 경우,로드 상단 부모 로더를 위탁 찾을 수 없습니다 클래스를 대상으로 다음를 찾아서 자신의 클래스 로더 경로의 대상 클래스를로드합니다.

예를 들어 수학 클래스, 첫 번째 응용 프로그램 클래스 로더는 응용 프로그램 로더가 먼저 확장 클래스 로더로드, 부트 클래스 로더를 위탁 확장 클래스 로더를 의뢰합니다로드 찾을 수 있습니다, 최고 ​​부트 로더는 자신의 클래스의 클래스를로드 Math 클래스를 찾을 수 없습니다 오랫동안 찾을 수있는 경로는 다음의 ED Math 클래스의 경로를 찾을 수 없습니다 자신의 클래스 로더에서 오랜 시간을 찾고,받을에게 자신을로드 응답을 부하 요청 Math 클래스, 확장 클래스 로더를 반환 수학 클래스는 응용 프로그램 클래스 로더에 다음로드 요청을 반환하는 응용 프로그램 클래스 로더는 자신의 클래스로드의 경로에 수학 클래스를 발견, 그래서 그는 자신을로드.

학부모 대표는 메커니즘은 간단했다 : 아버지가로드에 아버지에 의해 다음 자신이로드되지, 사람을 찾을 수 있습니다.

나는 대중의 수에 대해 우려 아니에요?

  • 다음과 같이받을 수 있습니다 [공공 우려 시아 오 치앙 고급 도로]를 2 차원 코드 번호를 종료 스윕 :
  • 학습 자료 : 1T 비디오 자습서 : 전면 및 후면 끝이 Javaweb 교육용 비디오, 기계 학습 / AI 교육용 비디오, 리눅스 시스템 튜토리얼 비디오, IELTS 비디오 자습서를 포함;
  • 100 개 이상의 책 : 포함 된 C / C ++는, 자바, 파이썬 프로그래밍 언어는 세 권의 책을 참조해야 LeetCode의 설명 Daquan의;
  • 소프트웨어 도구 : 대부분의 소프트웨어는 거의 당신이 도로를 프로그램에서 사용할 수있는 포함;
  • 프로젝트 소스 : 20 개 JavaWeb 소스 프로젝트.
    고급 소형 강력한 방법은 두 가지 차원 코드

추천

출처www.cnblogs.com/xiaoqiang-code/p/11526107.html