JVM 류 로드 메커니즘 원리 및 용법 분석

JVM 클래스 로드 메커니즘
JVM 류 로드 메커니즘 은 다섯 가지 부분 으로 나 뉘 는데 그것 이 바로 로드,검증,준비,해석,초기 화 이다.다음은 이 다섯 가지 과정 을 살 펴 보 자.

1.불 러 오기:
로 딩 은 클래스 로 딩 과정 에서 첫 번 째 단계 입 니 다.이 단 계 는 메모리 에 이러한 종 류 를 대표 하 는 자바.lang.class 대상 을 생 성하 여 방법 구역 과 같은 각종 데이터 의 입구 로 합 니 다.클래스 파일 에서 굳이 가 져 오지 않 아 도 됩 니 다.
ZIP 패키지 에서 읽 을 수 있 습 니 다(예 를 들 어 jar 패키지 와 war 패키지 에서 읽 을 수 있 습 니 다).실행 할 때 생 성(동적 에이전트)을 계산 할 수도 있 고 다른 파일 에서 생 성 할 수도 있 습 니 다(예 를 들 어 JSP 파일 을 대응 하 는 Class 클래스 로 변환 하 는 것).
2.검증:
이 단계 의 주요 목적 은 Class 파일 의 바이트 흐름 에 포 함 된 정보 가 현재 가상 컴퓨터 의 요구 에 부합 되 고 가상 컴퓨터 자체 의 안전 에 해 를 끼 치지 않도록 확보 하 는 것 이다.
3.준비:
준비 단 계 는 클래스 변수 에 정식으로 메모 리 를 분배 하고 클래스 변수의 초기 값 을 설정 하 는 단계 입 니 다.즉,방법 영역 에서 이 변수 들 이 사용 하 는 메모리 공간 을 분배 하 는 것 입 니 다.여기 서 말 하 는 초기 값 개념 을 주의 하 십시오.예 를 들 어 하나의 변수 가 다음 과 같이 정의 되 었 습 니 다.

public static int v = 8080; 
실제 변수 v 는 준비 단계 이후 의 초기 값 이 8080 이 아니 라 0 입 니 다.v 할당 값 을 8080 으로 하 는 put static 명령 은 프로그램 이 컴 파일 된 후 클래스 구조 기방법 에 저 장 됩 니 다.
그러나 성명 이 다음 과 같다 면 주의 하 십시오.

public static final int v = 8080; 
컴 파일 단계 에서 v 에 ConstantValue 속성 을 생 성하 고 준비 단계 에서 가상 기 회 는 ConstantValue 속성 에 따라 v 대 가 를 8080 으로 합 니 다.
4.해석:
해석 단 계 는 가상 컴퓨터 가 상수 탱크 의 기호 인용 을 직접 인용 으로 바 꾸 는 과정 을 말한다.기호 인용 은 class 파일 의:
1. CONSTANT_Class_info
2. CONSTANT_Field_info
3. CONSTANT_Method_info
등 유형의 상수.
기호 참조:기호 참조 가 가상 컴퓨터 가 실현 하 는 레이아웃 과 상 관 없 이 참조 하 는 목 표 는 반드시 메모리 에 불 러 와 야 하 는 것 이 아 닙 니 다.각종 가상 컴퓨터 가 실현 하 는 메모리 레이아웃 은 각각 다 를 수 있 지만 받 아들 일 수 있 는 기호 인용 은 일치 해 야 합 니 다.기호 가 인용 한 글자 의 양 형식 은 자바 가상 컴퓨터 가 규범 화 된 Class 파일 형식 에 명확 하 게 정의 되 어 있 기 때 문 입 니 다.
직접 참조:직접 인용 은 목 표를 가리 키 는 지침 일 수 있 으 며,상대 적 으로 오프셋 이나 목 표를 간접 적 으로 찾 을 수 있 는 문형 일 수 있 습 니 다.직접 인용 이 있 으 면 인용 목 표 는 메모리 에 존재 할 것 입 니 다.
5.초기 화:
초기 화 단 계 는 클래스 로 딩 의 마지막 단계 입 니 다.앞의 클래스 로 딩 단 계 는 로 딩 단계 에서 클래스 로 더 를 사용자 정의 할 수 있 는 것 을 제외 하고 다른 작업 은 JVM 이 주도 합 니 다.초기 단계 에 이 르 러 서 야 클래스 에서 정 의 된 자바 프로그램 코드 를 진정 으로 실행 하기 시작 했다.
초기 화 단 계 는 클래스 구조 기방법 을 실행 하 는 과정 입 니 다.방법 은 컴 파일 러 가 클래스 의 클래스 변 수 를 자동 으로 수집 하 는 할당 작업 과 정적 구문 블록 의 문 구 를 합 친 것 입 니 다.가상 기 회 는 하위방법 이 실행 되 기 전에 부모 클래스 의방법 이 실행 되 었 습 니 다.한 클래스 에 정적 변수 에 대한 할당 도 없고 정적 구문 블록 도 없 으 면 컴 파일 러 는 이 클래스 에()방법 을 생 성하 지 않 을 수 있 습 니 다.
다음 몇 가지 상황 에서 클래스 초기 화 를 실행 하지 않 습 니 다.
1.하위 클래스 를 통 해 부모 클래스 의 정적 필드 를 참조 하면 부모 클래스 의 초기 화 만 촉발 할 뿐 하위 클래스 의 초기 화 는 촉발 하지 않 습 니 다.
2.대상 배열 을 정의 합 니 다.이러한 종류의 초기 화 를 실행 하지 않 습 니 다.
3.상수 가 컴 파일 기간 에 호출 클래스 의 상수 탱크 에 저장 되 고 본질 적 으로 상수 가 정 의 된 클래스 를 직접 참조 하지 않 으 며 상수 가 있 는 클래스 를 정의 하지 않 습 니 다.
4.클래스 이름 으로 클래스 대상 을 가 져 오 면 클래스 의 초기 화 를 촉발 하지 않 습 니 다.
5.Class.forName 을 통 해 지정 한 클래스 를 불 러 올 때 지정 한 인자 initialize 가 false 일 경우 클래스 초기 화 를 실행 하지 않 습 니 다.사실 이 매개 변 수 는 가상 컴퓨터 에 클래스 를 초기 화 할 지 여 부 를 알려 주 는 것 입 니 다.
6.ClassLoader 의 기본 loadclass 방법 을 통 해 초기 화 동작 을 실행 하지 않 습 니 다.
클래스 로 더
1.클래스 로 더 시작(Bootstrap ClassLoader)
JAVA 로 딩 담당HOME\lib 디 렉 터 리 에 있 거나-Xbootclasspath 매개 변 수 를 통 해 경 로 를 지정 하고 가상 컴퓨터 에서 인 정 받 는 클래스 입 니 다.
2.확장 클래스 로 더(Extension ClassLoader)
JAVA 로 딩 담당HOME\lib\ext 디 렉 터 리 에 있 거나 자바 ext.dirs 시스템 변 수 를 통 해 경로 의 라 이브 러 리 를 지정 합 니 다.
3.응용 프로그램 클래스 로 더(응용 프로그램 클래스 로 더):
사용자 경로(classpath)의 라 이브 러 리 를 불 러 옵 니 다.JVM 은 부모 위임 모델 을 통 해 클래스 를 불 러 옵 니 다.물론 자바.lang.ClassLoader 를 계승 하여 사용자 정의 클래스 로 더 를 실현 할 수 있 습 니 다.

부모 위임
클래스 로 딩 요청 을 받 았 을 때,그 는 먼저 이 클래스 를 불 러 오 려 고 하지 않 고,이 요청 을 부모 클래스 에 위임 하여 완성 합 니 다.모든 클래스 로 딩 요청 이 이 렇 기 때문에,모든 로 딩 요청 은 시작 클래스 로 전송 해 야 합 니 다.부모 클래스 로 더 가 이 요청 을 완료 할 수 없 을 때 만(로 더 경로 에서 불 러 올 클 라 스 를 찾 지 못 했 습 니 다)하위 클래스 로 더 를 불 러 오 려 고 시도 합 니 다.
부모 가 위임 한 장점 중 하 나 는 rt.jar 가방 에 있 는 클래스 자바.lang.Object 를 불 러 오 는 것 입 니 다.어떤 로 더 를 불 러 오 든 이 종 류 를 불 러 오 는 것 입 니 다.마지막 으로 맨 위 에 있 는 시작 클래스 로 더 를 불 러 오 는 것 입 니 다.그러면 서로 다른 종류의 로 더 를 사용 하여 최종 적 으로 같은 Object 대상 을 얻 을 수 있 습 니 다.

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기