jvm 운행 원리 및 클래스 프로세서 실례 상세 설명

JVM 작 동 원리
먼저'자바'코드 파일 에서'class'바이트 파일 로 컴 파일 한 다음 에 클래스 로 더 는'class'바이트 파일 의 클래스 를 JVM 에 불 러 오고 마지막 으로 JVM 이 작성 한 코드 를 실행 합 니 다.실행 과정 은 다음 과 같다.

클래스 로 더
클래스 로드 프로 세 스
로드->검증->준비->해석->초기 화->사용->마 운 트 해제

로드
JVM 프로 세 스 가 시작 되면 클래스 를 메모리 에 불 러 온 다음 main()방법의 입구 코드 부터 실행 합 니 다.

public class HelloWorld {
    public static void main(String[] args) {
        
    }
}
로 딩 이란 클래스 CLass 파일 을 메모리 에 읽 어 들 이 고 자바.lang.Class 대상 을 만 드 는 것 을 말 합 니 다.
클래스 의 로 더 는 클래스 로 더 로 이 루어 집 니 다.클래스 로 더 는 보통 JVM 에서 제공 합 니 다.그 밖 에 ClassLoader 기본 클래스 를 계승 하여 클래스 로 더 를 만 들 수 있 습 니 다.
서로 다른 클래스 로 더 를 사용 하면 서로 다른 소스 에서 클래스 의 바 이 너 리 데 이 터 를 불 러 올 수 있 습 니 다.
로 컬 파일 시스템 에서 class 파일 을 불 러 옵 니 다
  • JAR 패키지 에서 class 파일 을 불 러 오고 JDBC 프로 그래 밍 에 사용 되 는 데이터베이스 드라이버 는 JAR 파일 에 놓 여 있 으 며 JVM 은 JAR 파일 에서 이 class 파일 을 직접 불 러 올 수 있 습 니 다
  • 네트워크 를 통 해 class 파일 을 불 러 옵 니 다자바 원본 파일 을 동적 으로 컴 파일 하고 불 러 오기
    준비 단계
    검증 하 다.
    자바 가상 컴퓨터 규범 에 따라 불 러 온'class'파일 의 내용 이 지정 한 규범 에 부합 되 는 지 확인 합 니 다.만약 에'class'파일 이 변경 되 고 안의 바이트 코드 가 규범 에 부합 되 지 않 으 면 JVM 은 이 바이트 코드 를 실행 할 수 없습니다."class"파일 을 메모리 에 불 러 온 후 먼저 검증 해 야 합 니 다.JVM 규범 에 완전히 부합 되 어야 JVM 에 맡 겨 실행 할 수 있 습 니 다.주로 네 가지 검증,파일 형식 검증,메타 데이터 검증,바이트 코드 검증,기호 참조 검증 을 포함한다.
    4.567917.파일 형식 검증:바이트 흐름 이 Class 파일 형식 규범 에 부합 되 는 지,그리고 현재 가상 컴퓨터 에 불 러 올 수 있 는 지 검증 합 니 다.예 를 들 어 주,차 버 전 번 호 는 현재 가상 컴퓨터 처리 범위 안에 있 습 니까?상수 탱크 에 지원 되 지 않 는 상수 형식 이 있 습 니까?상수 의 색인 값 에 존재 하지 않 는 상수 나 유형 에 맞지 않 는 상수 가 있 는 지 를 가리 키 는 상수4.567917.메타 데이터 검증:바이트 코드 가 묘사 한 정 보 를 의미 분석 하고 자바 의 언어 문법 규범 에 부합 되 는 지 분석 합 니 다4.567917.바이트 코드 검증:가장 중요 한 검증 절차 로 데이터 흐름 과 통 제 를 분석 하고 의미 가 합 법 적 이 고 논리 에 부합 되 는 지 확인한다.메타 데이터 검증 후 상대방 법 체 에 대한 주요 검증보증 류 방법 은 운행 시 위해 가 발생 하지 않 습 니 다4.567917.기호 인용 검증:주로 기호 인용 을 직접 인용 으로 전환 할 때 세 번 째 해석 단계 로 확대 되 고 주로 방문 유형 등 인용 과 관련 된 상황 을 확인한다.주로 인용 이 반드시 방문 되 고 유형 등 방문 할 수 없 는 문제 가 발생 하지 않도록 해 야 한다준비 하 다.
    인 용 된 클래스 에 일정한 메모리 공간 을 할당 한 다음 에 클래스 변수(즉 static 수식 변수)에 메모리 공간 을 할당 합 니 다.기본 초기 값 을 사용 하 십시오.
    해석 하 다.
    실제 적 으로 클래스 의 바 이 너 리 데이터 중의 기호 인용 을 직접 인용 하 는 과정 으로 바 꾸 었 는데 이 부분의 내용 은 비교적 복잡 하여 JVM 의 바 텀 으로 설계 되 었 다.
    4.567917.기호 인용:기호 인용 은 한 조 의 기호 로 인용 한 목 표를 묘사 하 는 것 이다.기 호 는 그 어떠한 글자 형식의 글자 양 이 될 수 있 고 충돌 이 발생 하지 않 으 면 위 치 를 찾 을 수 있 으 면 된다.레이아웃 은 메모리 와 무관 합 니 다.
    4.567917.직접 인용:목 표를 가리 키 는 지침,오프셋 또는 직접 위 치 를 정할 수 있 는 문형 이다.이 인용 은 메모리 의 레이아웃 과 관련 이 있 으 며 반드시 불 러 옵 니 다.
    분석 은 주로 다음 과 같 습 니 다:
    류 또는 인터페이스의 해석필드 분석
    유형 분석
    인터페이스 방법 분석
    초기 화
    초기 화 는 클래스 의 정적 변수 에 정확 한 초기 값 을 부여 하 는 것 입 니 다.준비 단계 와 초기 화 단계 가 약간 모순 되 는 것 처럼 보이 지만 사실은 모순 되 지 않 습 니 다.만약 에 클래스 에 문장 이 있다 면 private static int a=10 의 실행 과정 은 이 렇 습 니 다.먼저 바이트 파일 이 메모리 에 불 러 온 후에 링크 의 검증 절 차 를 진행 하고 검증 통과 후 준비 단계 입 니 다.a 에 게 메모 리 를 할당 합 니 다.변수 a 는 static 이기 때문에 이때 a 는 int 형식의 기본 초기 값 0,즉 a=0 과 같 습 니 다.그리고 해석(뒤에서 말 합 니 다)까지 이 단 계 를 초기 화 할 때 a 의 진정한 값 10 을 a 에 게 부여 합 니 다.이때 a=10
    하나의 매우 중요 한 규칙 은 한 종 류 를 초기 화 할 때 그의 부류 가 아직 초기 화 되 지 않 았 다 는 것 을 발견 하면 반드시 먼저 그의 부 류 를 초기 화 해 야 한 다 는 것 이다.
    로 더
    시작 클래스/루트 프로세서
    Bootstrap ClassLoader,그 는 주로 우리 가 기계 에 설치 한 자바 디 렉 터 리 의 핵심 클래스 를 불 러 오 는 것 을 책임 지 며,네 이 티 브 코드 로 이 루어 집 니 다.자바.lang.ClassLoader($JAVA 불 러 오 는 것 을 책임 지지 않 습 니 다.HOME 에서 jre/lib/rt.jar 의 모든 class 는 C++로 이 루어 집 니 다.ClassLoader 하위 클래스 가 아 닙 니 다.유도 클래스 로 더 는 가상 컴퓨터 로 컬 구현 디 테 일 과 관련 되 기 때문에 개발 자 는 시작 클래스 로 더 의 인용 을 직접 가 져 올 수 없 기 때문에 직접 인용 을 통 해 조작 할 수 없습니다.
    확장 클래스 로 더
    Extension ClassLoader 는 JRE 의 확장 디 렉 터 리,lib/ext 또는 java.ext.dirs 시스템 속성 이 지정 한 디 렉 터 리 의 JAR 패 키 지 를 불 러 오 는 클래스 입 니 다.자바 언어 로 구현 되 며,부모 클래스 로 더 는 null 입 니 다.
    응용 프로그램 클래스 로 더
    응용 프로그램 ClassLoader 는 응용 프로그램(시스템 이 라 고도 함)클래스 로 불 리 며 JVM 이 시 작 될 때 자바 명령 에서 온-classpath 옵션,java.classpath 시스템 속성,또는 CLASSPATH 가 변수 가 지정 한 JAR 패키지 와 클래스 경 로 를 불 러 옵 니 다.프로그램 은 ClassLoader 의 정적 방법 getSystem ClassLoader()를 통 해 시스템 클래스 로 더 를 가 져 올 수 있 습 니 다.특별히 지정 되 지 않 으 면 사용자 정의 클래스 로 더 는 부모 로 더 를 사용 합 니 다.자바 언어 로 구현 되 며,부모 클래스 로 더 는 ExtClassLoader 입 니 다.
    클래스 로 더 클래스 는 다음 과 같은 8 단 계 를 거 쳐 야 합 니 다.
  • 이 Class 가 불 러 온 적 이 있 는 지,즉 버퍼 에 이 Class 가 있 는 지,8 단계 에 직접 들 어가 지 않 으 면 2 단계 에 들 어 갑 니 다
  • 부모 클래스 로 더 가 없 으 면 Parent 가 루트 로 더 이거 나 그 자체 가 루트 로 더 라면 4 단계 로 뛰 고 부모 클래스 로 더 가 존재 하면 3 단계 로 들어간다
  • 부모 클래스 로 더 를 사용 하여 목표 클래스 를 불 러 오 라 고 요청 합 니 다.불 러 오 는 데 성공 하면 8 단계 로 넘 어 갑 니 다.그렇지 않 으 면 5 단계 로 넘 어 갑 니 다
  • 4.567917.루트 카 운 터 를 사용 하여 목표 클래스 를 불 러 오 라 고 요청 합 니 다.불 러 오 는 데 성공 하면 8 단계 로 건 너 갑 니 다.그렇지 않 으 면 7 단계 로 건 너 갑 니 다
  • 현재 클래스 로 더 는 Class 파일 을 찾 으 려 고 시도 하고 찾 으 면 6 단 계 를 실행 하 며 찾 지 못 하면 7 단 계 를 실행 합 니 다
  • 파일 에서 Class 를 불 러 오고 성공 한 후 8 단계 로 건 너 뜁 니 다
  • ClassNotFountException 이상 던 지기
  • 대응 하 는 java.lang.class 대상 을 되 돌려 줍 니 다
  • 사용자 정의 클래스 로 더
    위의 몇 가 지 를 제외 하고 클래스 로 더 를 사용자 정의 하여 자신의 요구 에 따라 클래스 를 불 러 올 수 있 습 니 다.
    클래스 로드 메커니즘
    JVM 의 클래스 로드 메커니즘 은 주로 다음 과 같은 세 가지 가 있 습 니 다.
    전체 책임:전체 책임 이란 하나의 클래스 로 더 가 특정한 클래스 를 불 러 올 때 이 클래스 가 의존 하고 인용 하 는 다른 클래스 도 이 클래스 로 더 가 불 러 옵 니 다.다른 클래스 로 더 를 불 러 오지 않 는 한4.567917.부모 위임:부모 위임 이란 부모 클래스 로 더 를 불 러 오 게 하 는 것 입 니 다.부모 클래스 로 더 를 불 러 올 수 없 을 때 만 자신의 클래스 경로 에서 이 클래스 를 불 러 오 려 고 합 니 다.쉽게 말 하면 특정한 클래스 로 더 가 로 더 류 의 요청 을 받 았 을 때 먼저 로 더 작업 을 부모 로 더 에 의뢰 하고 순서대로 재 귀 하 는 것 입 니 다.만약 에 부모 로 더 가 클래스 로 더 작업 을 완성 할 수 있다 면 성공 적 으로 돌아 갈 수 있 습 니 다.부모 로 더 만 이 로 딩 작업 을 수행 할 수 없 을 때 만 스스로 로 딩 합 니 다캐 시 메커니즘.캐 시 시스템 은 불 러 온 모든 Class 가 캐 시 되 는 것 을 보장 합 니 다.프로그램 에서 특정한 Class 를 사용 해 야 할 때 클래스 로 더 는 캐 시 영역 에서 이 Class 를 찾 습 니 다.캐 시 영역 에 이 Class 대상 이 존재 하지 않 을 때 만 시스템 은 이러한 바 이 너 리 데 이 터 를 읽 고 Class 대상 으로 변환 하여 버퍼 에 저장 합 니 다.이것 이 바로 Class 를 수정 한 후에 JVM 을 다시 시작 해 야 프로그램 이 수정 한 것 이 효력 이 발생 하 는 이유 입 니 다.
    양친 위임 메커니즘

    이것 이 바로**부모 위임 모델 입 니 다.**먼저 아버 지 를 찾 아 불 러 오고 안 되면 아들 이 불 러 옵 니 다.
    4.567917.부모 위임 체 제 는 하나의 클래스 로 더 가 클래스 로 더 요청 을 받 으 면 자신 이 먼저 로 더 를 불 러 오지 않 고 이 요청 을 부모 클래스 의 로 더 에 의뢰 하여 실행 하 는 것 입 니 다.만약 에 부모 클래스 로 더 가 존재 한다 면 한 단계 위로 의뢰 하고 순서대로 재 귀 하 며 최종 적 으로 최상 위 에 도착 하 는 시작 클래스 로 더 를 요청 합 니 다.만약 에 아버지 클래스 로 더 가 클래스 로 더 임 무 를 완성 할 수 있다 면 성공 적 으로 돌아 갈 수 있 습 니 다.만약 에 아버지 클래스 로 더 가 이 로 더 임 무 를 완성 하지 못 하면 서브 로 더 는 자신 이 로 더 를 시도 할 수 있 습 니 다.이것 이 바로 부모님 의 위임 모델 입 니 다.즉,모든 아들 이 게 을 러 서 일이 있 을 때마다 아버지 에 게 맡 깁 니 다.아버지 께 서 이 일 을 저도 할 수 없다 고 하 실 때 아들 은 스스로 방법 을 생각해 서 완성 할 수 있 습 니 다4.567917.부모 위임 체제 의 장점:부모 위임 모델 을 사용 하 는 것 은 자바 류 가 그의 유형 에 따라 우선 순 위 를 가 진 차원 관 계 를 가 진 다 는 것 이다.이런 등급 관 계 를 통 해 유형의 중복 로드 를 피 할 수 있다.아버지 가 이런 유형 을 불 러 왔 을 때 서브 ClassLoader 를 다시 불 러 올 필요 가 없다.그 다음으로 보안 요 소 를 고려 하여 자바 핵심 api 에서 정 의 된 유형 은 임의로 바 뀌 지 않 습 니 다.네트워크 를 통 해 자바.lang.Integer 라 는 종 류 를 전달 하고 부모 의뢰 모드 를 통 해 시작 클래스 로 전달 되 며,시작 클래스 로 더 는 핵심 자바 API 에서 이 이름 의 종 류 를 발견 하여 불 러 온 것 을 발견 하 였 습 니 다.네트워크 에서 전 달 된 자바.lang.Integer 를 다시 불 러 오지 않 고 불 러 온 Integer.class 로 돌아 가면 핵심 API 라 이브 러 리 가 임의로 변경 되 는 것 을 방지 할 수 있 습 니 다총결산
    jvm 의 운행 원리 와 클래스 로 더 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 jvm 의 운행 원리 와 클래스 로 더 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기