JVM 의 클래스 로드 과정 및 부모 위임 모델 상세 설명

jvm 의 주요 구성 부분
클래스 로 더(ClassLoader)실행 시 데이터 영역(Runtime Data Area)실행 엔진(Execution Engine)로 컬 라 이브 러 리 인터페이스(Native Interface)jvm 실행 시 데이터 영역 구성
방법 영역:
① 방법 구역 은 가상 컴퓨터 에 불 러 온 클래스 정보(구조 기,인터페이스 정의),상수,정적 변수 와 운행 시 상수 탱크 등 데 이 터 를 저장 하 는 데 사용 된다.
② 이 구역 은 스 레 드 에 의 해 공 유 됩 니 다.
③ 방법 구역 에 정적 컴 파일 로 생 성 된 글자 의 양 과 기호 인용 을 저장 하 는 데 사용 되 는 런 타임 풀 이 있 습 니 다.이 상수 탱크 는 동태 성 을 가지 고 있다.즉,상수 가 반드시 컴 파일 할 때 확정 되 는 것 이 아니 라 실행 할 때 생 성 되 는 상수 도 이 상수 탱크 에 존재 한 다 는 것 이다.
가상 컴퓨터 스 택:
가상 스 택 은 스 택 메모리 라 고도 합 니 다.자바 프로그램의 운행 을 주관 합 니 다.스 레 드 를 만 들 때 만 듭 니 다.그의 생명 기 는 스 레 드 의 생명 기 를 따 르 고 스 레 드 가 끝나 면 스 택 메모리 도 방출 됩 니 다.스 택 에 쓰레기 회수 문제 가 존재 하지 않 습 니 다.스 레 드 가 끝나 면 이 스 택 은 Over 이 고 생명 주기 와 스 레 드 가 일치 하 며 스 레 드 가 개인 적 입 니 다.
8 가지 기본 유형의 변수+대상 의 인용 변수+인 스 턴 스 방법 은 모두 함수 의 스 택 메모리 에서 분 배 됩 니 다.
① 모든 방법 은 실행 할 때 스 택 프레임 을 만 들 고 국부 변수 표,조작 스 택,동적 링크 와 방법 수출 등 정 보 를 저장 하 는 데 사용 된다.
② 가상 컴퓨터 스 택 은 스 레 드 의 개인 적 인 것 으로 수명 주 기 는 스 레 드 와 같 습 니 다.
③ 부분 변수 표 에는 기본 데이터 형식,returnAddress 형식(바이트 코드 명령 을 가리 키 는 주소)과 대상 참조 가 저 장 됩 니 다.이 대상 은 대상 의 시작 주 소 를 가리 키 는 지침 일 수도 있 고 대상 을 대표 하 는 핸들 이나 이미지 와 연 결 된 위치 일 수도 있 습 니 다.4.부분 변수 에 필요 한 메모리 공간 은 컴 파일 러 간 에 확인 합 니 다.
④ 조작 수 스 택 의 역할 은 주로 연산 결과 와 연산 의 조작 수 를 저장 하 는데 국부 변수 표 가 색인 을 통 해 방문 하 는 것 이 아니 라 스 택 을 누 르 고 스 택 을 나 가 는 방식 과 다르다.
⑤ 모든 스 택 프레임 은 런 타임 풀 에서 이 스 택 프레임 에 속 하 는 방법 에 대한 인용 을 포함 하고 있 습 니 다.이 인용 을 가지 고 있 는 것 은 방법 호출 과정 에서 의 동적 연결 을 지원 하기 위해 서 입 니 다.동적 링크 는 상수 풀 의 기 호 를 런 타임 에 직접 참조 하 는 것 입 니 다.
로 컬 방법 창고
로 컬 방법 스 택 은 가상 컴퓨터 스 택 과 유사 하지만 로 컬 방법 스 택 은 Native 방법 으로 서 비 스 를 제공 합 니 다.
쌓다
자바 더 미 는 모든 스 레 드 가 공유 하 는 메모리 입 니 다.가상 컴퓨터 가 시 작 될 때 만 듭 니 다.거의 모든 대상 인 스 턴 스 가 이곳 에서 만 들 어 졌 기 때문에 이 지역 에 서 는 쓰레기 회수 작업 이 자주 발생 합 니 다.
프로그램 카운터
메모리 공간 이 작 습 니 다.바이트 디 스 플레이 가 작업 할 때 이 계산 치 를 바 꾸 면 다음 에 실행 해 야 할 바이트 코드 명령 을 선택 할 수 있 습 니 다.분기,순환,점프,이상 처리 와 스 레 드 복구 등 기능 은 모두 이 카운터 에 의존 하여 이 루어 져 야 합 니 다.이 메모리 구역 은 유일한 자바 가상 컴퓨터 규범 으로 OOM(프로그램 신청 메모리 가 너무 커서 가상 컴퓨터 가 우 리 를 만족 시 키 지 못 하고 자살 했다)상황 을 규정 하지 않 은 구역 입 니 다.
가상 컴퓨터 에서 프로그램의 실행 과정

먼저 클래스 로 더 를 불 러 와 클 라 스 템 플 릿 을 가 져 옵 니 다.방법 영역 에(클래스 정보(구조 기,인터페이스 정의),상수,정적 변수 와 실행 시 상수 탱크 등 데이터)를 넣 고 클 라 스 템 플 릿 에 따라 대상 을 예화 할 때 대상 을 더미 에 넣 습 니 다(스 팸 회수 전략,스 팸 회수 알고리즘,메모리 누 출 원인 을 제시 할 수 있 습 니 다).대상 호출 방법 에 따라 스 택 에 방법 을 누 를 수 있 습 니 다(8 가지 기본 유형의 변수+대상 의 참조 변수+인 스 턴 스 방법).native 방법 은 로 컬 방법 스 택 에 누 르 고 jvm 에서 운영 체제 에 명령 을 보 내 며 엔진 설명 명령 을 실행 하여 운영 체제 에 보 냅 니 다.운영 체 제 는 로 컬 방법 인 터 페 이 스 를 호출 하여 로 컬 방법 라 이브 러 리 로 로 로 로 컬 방법 을 수행 합 니 다.스 택 에 있 는 방법 은 후진 이 먼저 나 오 는 순서에 따라 스 택 을 나 가 고 프로그램 카운터 에서 다음 스 택 을 나 가 는 방법 을 가리 키 며 스 택 에 쓰레기 를 회수 하지 않 았 습 니 다.그들 은 스 레 드 의 실행 이 끝나 면서 풀 려 났 습 니 다.
클래스 로 딩 부모 위임 모델

부모 위임 모델 을 소개 하기 전에 다음 종류의 로 더 를 먼저 말 하 세 요.임의의 클래스 에 대해 서 는 클래스 로 더 를 불 러 오 는 것 과 이 클래스 자체 가 JVM 에서 의 유일 성 을 확립 해 야 합 니 다.모든 클래스 로 더 는 독립 된 클래스 이름 공간 이 있 습 니 다.클래스 로 더 는 지 정 된 모든 한정 이름 에 따라 class 파일 을 JVM 메모리 에 불 러 온 다음 class 대상 으로 전환 하 는 것 입 니 다.
클래스 로 더 분류:
시작 클래스 로 더(Bootstrap ClassLoader)는 가상 컴퓨터 자체 의 일부분 으로 자바 를 불 러 옵 니 다.HOME/lib/디 렉 터 리 에 있 거나-Xbootclasspath 매개 변수 가 지정 한 경로 에서 가상 컴퓨터 에 의 해 인식 되 는 라 이브 러 리;
확장 클래스 로 더(Extension ClassLoader):로 딩 담당\lib\ext 디 렉 터 리 나 자바.ext.dirs 시스템 변수 가 지정 한 경로 의 모든 라 이브 러 리;
응용 프로그램 클래스 로 더(Application ClassLoader).사용자 클래스 경로(classpath)에 지정 한 라 이브 러 리 를 불 러 오 는 것 을 책임 집 니 다.이 종류의 로 더 를 직접 사용 할 수 있 습 니 다.일반적으로 사용자 정의 클래스 로 더 가 없 으 면 기본적으로 이 로 더 를 사용 합 니 다.
사용자 정의 클래스 로 더
그들 사 이 는 그림 에서 보 듯 이 위 에서 아래로 의 관계 이다.
만약 클래스 로 더 가 클래스 로 더 요청 을 받 았 다 면,먼저 이 클래스 를 불 러 오지 않 고,이 요청 을 부모 클래스 로 더 에 위임 합 니 다.각 층 의 클래스 로 더 는 이 렇 습 니 다.그러면 모든 로 더 요청 은 맨 위 에 있 는 시작 클래스 로 전 송 됩 니 다.부모 가 불 러 오 는 요청 을 완료 할 수 없 을 때(검색 범위 에서 필요 한 클래스 를 찾 을 수 없 음),하위 로 더 를 위 에서 아래로 불 러 오 게 합 니 다.
그렇다면 우 리 는 어떻게 이 견 해 를 검증 합 니까?
우 리 는 간단 한 애플 릿 을 쓴다.

그리고 이 자바 파일 을 컴 파일 하여 class 파일 을 생 성 합 니 다.

이 파일 을 시작 클래스 로 더 가 불 러 올 수 있 는 곳 에 두 었 습 니 다.새 디 렉 터 리 classes:D:\Program Files\자바\jdk 1.8.0161\jre\classes
그리고 프로그램의 수정:

다시 컴 파일 하고 생 성 된 classes 파일 을 확장 실행 기 가 불 러 올 수 있 는 곳 에 두 고 새 폴 더 classes:D:\Program Files\자바\jdk 1.8.0161\jre\lib\ext\classes
마지막 으로 우 리 는 다시 수정 했다.

생 성 된 class 파일 은 현재 디 렉 터 리 아래 에 있 습 니 다.
그러면 저희 가 이 클 라 스 파일 을 실행 할 때 나 오 는 결 과 는 무엇 일 까요?

현재 디 렉 터 리 에 있 는 class 파일 을 불 러 오지 않 고 시작 클래스 로 더 스 캔 범위 내 에 있 는 파일 을 사용 했다 는 뜻 입 니 다.
더 검증,우 리 는 D:\\Program Files\Java\\jdk 1.8.0 를 삭제 합 니 다.161\jre\classes 의 파일
다시 실행 결과:

결 과 는 bbb 로 바 뀌 었 습 니 다.시작 클래스 로 더 가 class 파일 을 찾 지 못 했 을 때 확장 클래스 로 더 가 불 러 왔 습 니 다.
확장 클래스 로 더 범위 내의 파일 도 삭제 합 니까?

현재 폴 더 에 있 는 class 파일 을 불 러 왔 습 니 다.
면접 문제:
자신의 코드 에 자바.lang.string 대상 을 만 들 수 있 습 니까?가능 하 다 면,이 대상 은 클래스 로 더 에 불 러 올 수 있 습 니까?
만 들 수 있 지만 불 러 올 수 없습니다.
부모 위임 모드 는 부모 클래스 로 더 를 먼저 불 러 올 수 있 습 니 다.바로 BootStrap(시작 클래스)로 더 를 불 러 올 수 있 습 니 다.jdk 에 있 는 자바.lang.string 류 는 사용자 정의 자바.lang.string 류 는 영원히 불 러 오지 않 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기