JVM 의 체계 구 조 를 초보 적 으로 인식 하 다.

9396 단어 JVM체계 구조
JVM 이란 무엇 입 니까?
JVM(Java Virtual Machine)은 추상 적 인 컴퓨터 로 실제 컴퓨터 와 마찬가지 로 명령 집합 을 가지 고 서로 다른 저장 영역 을 사용 하 며 명령 을 수행 하고 데이터,메모리,레지스터 도 관리 해 야 한다.
이곳 을 보 니 JVM 을 모 르 는 사람 은 이미 속 았 다.괜 찮 습 니 다.다음은 제 가 여러분 께 JVM 의 체계 구조 도 를 상세 하 게 소개 하 겠 습 니 다.아마도 당신 은 좀 알 것 입 니 다.
쉽게 말 하면 JVM 은 가상 컴퓨터 다.우 리 는 자바 언어 중의 한 가지 특성 이 바로 크로스 플랫폼 이라는 것 을 알 고 있 으 며,JVM 은 자바 프로그램 이 크로스 플랫폼 을 실현 하 는 관건 적 인 부분 이다.자바 컴 파일 러 가 자바 프로그램 을 컴 파일 할 때 플랫폼 과 무관 한 바이트 코드(즉,class 파일)를 생 성 합 니 다.플랫폼 과 무관 하 다 는 것 은 컴 파일 로 생 성 된 바이트 코드 를 Window,Linux,Mac 시스템 에서 모두 실행 할 수 있 습 니 다.즉,자바 컴 파일 로 생 성 된 class 파일 은 플랫폼 을 대상 으로 하 는 것 이 아니 라 JVM 을 대상 으로 하 는 것 이다.플랫폼 마다 JVM 이 다 르 지만 똑 같은 인 터 페 이 스 를 제공 합 니 다.그림 1 은 자바 의 대략적인 운행 절차 입 니 다.
在这里插入图片描述
'미 친 자바 강의'에서 언급 한 예 를 인용 하여 JVM 의 역할 을 이해 하 는 데 도움 을 줍 니 다.
JVM 의 역할 은 마치 두 개의 서로 다른 연필 이 있 는 것 과 같 지만 같은 펜 모 자 를 두 개의 서로 다른 펜 에 씌 워 야 한다.이 두 펜 에 각각 하나의 컨버터 를 제공 해 야 한다.이 컨버터 는 위로 향 하 는 인터페이스 가 같 고 같은 펜 모자 에 적응 하 는 데 사용 된다.아래 의 인터페이스 가 다 르 기 때문에 두 개의 서로 다른 펜 에 적응 하 는 데 쓰 인 다.이 비교 에서 두 개의 서로 다른 펜 은 서로 다른 운영 체제 이 고 같은 펜 모 자 는 자바 바이트 코드 프로그램 이 며 컨버터 역할 은 JVM 에 대응 한 다 는 것 을 비슷 하 게 이해 할 수 있다.이와 유사 하 게 JVM 은 위 와 아래 두 부분 으로 나 뉘 는데 모든 플랫폼 의 JVM 이 자바 바이트 프로그램 에 제공 하 는 인 터 페 이 스 는 똑 같 지만 아래 에 적응 하 는 서로 다른 플랫폼 의 인 터 페 이 스 는 서로 다르다 고 볼 수 있다.
JVM 시스템 구조 개관
위 에서 우 리 는 JVM 의 역할 을 초보 적 으로 소개 했다.그러면 JVM 을 깊이 이해 하려 면 JVM 의 체계 구 조 를 알 아야 한다.그림 2 를 보십시오.
在这里插入图片描述
그림 2 는 JVM 의 체계 구조 도이 다.이어서 모든 부분 이 무슨 뜻 인지 이야기 해 보 자.
1.클래스 로 더 서브 시스템(ClassLoader)
class 파일 을 불 러 오 는 것 을 책임 집 니 다.class 파일 은 파일 시작 에 특정한 파일 표시 가 있 습 니 다.class 파일 바이트 코드 내용 을 메모리 에 불 러 오고 이 내용 을 방법 영역 에서 실 행 될 때 데이터 구조 로 변환 합 니 다.classLoader 는 class 파일 의 불 러 오기 만 책임 집 니 다.실행 가능 한 지 여 부 는 Execution Engine 에서 결정 합 니 다.
자바 컴 파일 로 생 성 된*.class 파일 은 ClassLoader 를 통 해 불 러 옵 니 다.그러면 몇 가지 문제 가 있 습 니 다.
ClassLoader 는*.class 파일 이 불 러 올 파일 이라는 것 을 어떻게 압 니까?
일반 파일 의 확장 이름 을 class 접미사 로 수 동 으로 바 꾸 면 ClassLoader 에서 이 파일 을 불 러 올 까요?
실제로 클 라 스 파일 은 파일 의 시작 부분 에 특정한 파일 표지 가 있 습 니 다.자바 프로그램 을 마음대로 작성 하고 클 라 스 파일 을 컴 파일 하여 만 듭 니 다.열 면 다음 과 같은 내용 을 볼 수 있 습 니 다.
在这里插入图片描述
cafe babe 는 class 파일 의 표지 입 니 다.ClassLoader 는 cafe babe 가 있 는 class 파일 을 불 러 옵 니 다.class 파일 바이트 코드 내용 을 메모리 에 불 러 오고 이 내용 을 방법 영역 에서 실 행 될 때의 데이터 구조 로 변환 합 니 다.ClassLoader 는 class 파일 의 불 러 오기 만 담당 합 니 다.실행 가능 한 지 여 부 는 Execution Engine 에서 결정 합 니 다.그림 3 을 보십시오.
在这里插入图片描述
Car.class 파일 은 ClassLoader 를 통 해 메모리 에 불 러 옵 니 다.Car Class 는 메모리 에 상당 한 템 플 릿 입 니 다.우 리 는 이 템 플 릿 을 통 해 서로 다른 인 스 턴 스 car1,car2,car3 로 예화 할 수 있 습 니 다.
ClassLoader 로 Car.class 를 불 러 오 는 것 은 자바 에서 어떤 종류의 로 더 를 불 러 오 는 것 일 까?이 문 제 를 풀기 전에 우 리 는 먼저 간단 한 코드 를 써 보 자.

//new  Car  
        Car car = new Car();

        //  ClassLoader
        ClassLoader classLoader = car.getClass().getClassLoader();

        //    
        System.out.println(classLoader);
在这里插入图片描述
결 과 는:
우 리 는 또 다른 코드 를 보 자.

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">        //new       
        Car car = new Car();
        String string = new String(); //  ClassLoader
        ClassLoader classLoader1 = car.getClass().getClassLoader();
        ClassLoader classLoader2 = string.getClass().getClassLoader(); //    
 System.out.println(classLoader1);
        System.out.println(classLoader2);</pre>

결 과 는:
在这里插入图片描述
위 에서 알 수 있 듯 이 ClassLoader 의 인쇄 결 과 는'sun.misc.Launcher$'입 니 다.AppClassLoader@18b4aac2"하 나 는"null"입 니 다.이것 은 어떻게 된 일 입 니까?세심 한 친 구 는 이 두 개의 서로 다른 대상 중에서 car 대상 은 우리 가 쓴 유형 이 고 string 대상 은 시스템 자체 의 유형 입 니 다.쉽게 말 하면 ClassLoader 는 클래스 에 따라 다양한 종류의 로 더 를 선택 하여 불 러 옵 니 다.여기 에는 ClassLoader 의 분류 가 걸 려 있 습 니 다.
ClassLoader 의 종류:
클래스 로 더 시작(BootStrap)
확장 클래스 로 더(Extension)
응용 프로그램 클래스 로 더(AppClassLoader)
사용자 정의 로 더
일반적으로 우리 가 쓴 클래스 로 더 는 모두 AppClassLoader 입 니 다.바로 위의 그림 에서 보 여 준"sun.misc.Launcher$"입 니 다.AppClassLoader@18b4aac2"그런데 왜 string 이라는 대상 은"null"입 니까?실제로 이"null"은 부 트 스 트랩 이라는 로 더 를 사용 하 는 것 을 말한다.
그것 은 의문 이 있 을 수 있 습 니 다.자신 이 정의 하 는 클래스 는 AppClassLoader 를 사용 합 니 다.이해 할 수 있 습 니 다.car 라 는 대상 이 출력 하 는 클래스 로 더 이름 에 AppClassLoader 라 는 글자 가 있 기 때 문 입 니 다.그런데 왜 string 이라는 대상 은'null'입 니까?어디서 BootStrap 이라는 로 더 를 사용 하 는 지 나 타 낼 수 있 습 니까?이 렇 습 니 다.부 트 스 트랩 누적 로 더 는 확장 클래스 로 더,응용 프로그램 클래스 로 더 의 조상 에 해당 합 니 다.부 트 스 트랩 을 사용 하면 부 트 스 트랩 의 이전 단계 가 없어 졌 기 때문에'null'로 표시 합 니 다.
사실 우 리 는 String 이라는 종류 가 JDK 에 있 는 위 치 를 찾 아 볼 수 있다.

$JAVA_HOME/jre/lib/rt.jar/java/lang
이 경로 에 있 는 모든$JAVAHOME/jre/lib/rt.jar 이 jar 가방 의 종 류 는 모두 BootStrap 으로 불 러 옵 니 다.
다음은 그림 4 를 보십시오.
在这里插入图片描述
이 그림 은 뚜렷하게 볼 수 있다.
1.모든 것 은$자바Home/jre/lib/rt.jar 는 BootStrap 을 통 해 불 러 옵 니 다.
2.모든 것 은$자바Home/jre/lib/ext/*.jar 는 Extension 을 통 해 불 러 옵 니 다.
3.모든$CLASSPATH 는 SYSTEM 을 통 해 불 러 옵 니 다.(응용 프로그램 클래스 로 더 는 시스템 클래스 로 더 라 고도 합 니 다.현재 응용 프로그램의 classpath 모든 클래스 를 불 러 옵 니 다)
다음 에 우 리 는 다시 하나의 예 를 보 자.
자바.lang 패 키 지 를 만 들 고 String 류 를 만 들 면 한 마디 를 인쇄 해서 실행 하 는 것 은 어 떨 까요?

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">package java.lang; public class String { public static void main(String[] args) {
        System.out.println("Hello World");
    }
}</pre>

효 과 는 다음 과 같 습 니 다:
在这里插入图片描述
프로그램 이 틀 렸 다 는 것 을 볼 수 있 습 니 다.main 방법 을 찾 을 수 없다 고 했 는데 main 방법 이 있 는데 왜 실행 하지 않 았 습 니까?여기 에는 양친 위임 체제 가 관련 되 어 있다.
양친 위임 메커니즘:
클래스 가 클래스 로 딩 요청 을 받 았 을 때,그 는 먼저 이 클래스 를 불 러 오 려 고 시도 하지 않 고,이 요청 을 부모 클래스 에 위임 하여 완성 합 니 다.모든 클래스 로 딩 요청 이 이 렇 기 때문에 모든 로 딩 요청 은 시작 클래스 로 전송 해 야 합 니 다.부모 클래스 로 더 가 이 요청 을 완료 할 수 없 을 때 만(로 더 경로 에서 불 러 올 클 라 스 를 찾 지 못 했 습 니 다)하위 클래스 로 더 를 불 러 오 려 고 시도 합 니 다.
그래서 실제 운행 과정 은 다음 과 같다.
ClassLoader 는 String 류 의 로드 요청 을 받 았 습 니 다.
먼저 Bootstrap 에 가서 이런 종류 가 있 는 지 찾 아 보 세 요.없 으 면 피드백 으로 이 요청 을 완성 할 수 없습니다.그러나 마침 rt.jar 에서 java.lang.Stiring 이라는 종 류 를 찾 았 습 니 다.
이 종 류 를 실행 합 니 다.이 종 류 는 main 방법 을 정의 하지 않 았 습 니 다.
오류,클래스 에 main 방법 이 정의 되 지 않 았 습 니 다.
그래서 위의 예 를 들 어 그 는 jdk 에서 자바.lang.string 이라는 종 류 를 찾 을 것 이다.이 종 류 는 확실히 main 방법 을 정의 하지 않 았 다.쉽게 말 하면 JDK 에서 자바.lang.string 이라는 종 류 를 실행 하 는 것 이지 우리 가 정의 하 는 종류 가 아니다.
그럼 양친 위임 체제 로 무슨 좋 은 점 이 있 습 니까?
부모 가 위임 한 장점 중 하 나 는 rt.jar 가방 에 있 는 클래스 자바.lang.Object 를 불 러 오 는 것 입 니 다.어떤 로 더 를 불 러 오 든 이 종 류 를 불 러 오 는 것 입 니 다.마지막 으로 맨 위 에 있 는 시작 클래스 로 더 를 불 러 오 는 것 입 니 다.그러면 서로 다른 종류의 로 더 를 사용 하여 최종 적 으로 같은 Object 대상 을 얻 을 수 있 습 니 다.
2.실행 엔진(실행 엔진)
엔진 은 설명 명령 을 수행 하고 운영 체제 에 제출 하여 실행 합 니 다.여 기 는 실행 엔진 에 대해 너무 많은 설명 을 하지 않 습 니 다.그 가 명령 을 설명 하 는 것 을 알 면 됩 니 다.
3.로 컬 방법 인터페이스(Native Interface)와 로 컬 방법 스 택(Native Method Stack)
로 컬 인터페이스:로 컬 인터페이스의 역할 은 서로 다른 프로 그래 밍 언어 를 자바 에 융합 시 키 는 것 입 니 다.그 취 지 는 C/C+프로그램 을 융합 시 키 는 것 입 니 다.자바 가 태 어 났 을 때 C/C+가 횡행 할 때 발 을 붙 이려 면 C/C+프로그램 을 호출 해 야 합 니 다.그래서 메모리 에 지역 처리 가 native 로 표 시 된 코드 를 만 들 었 습 니 다.그것 의 구체 적 인 방법 은 Native Method Stack 에 native 방법 을 등록 하고 Execution Engine 이 실 행 될 때 native libraies 를 불 러 오 는 것 이다.
현재 이 방법 은 하드웨어 와 관련 된 응용 을 제외 하고 자바 프로그램 을 통 해 프린터 를 구동 하거나 자바 시스템 을 통 해 생산 설 비 를 관리 하 는 것 이 기업 급 응용 에서 보기 드물다.현재 의 이색 적 인 분야 간 의 통신 이 매우 발달 하기 때문에 예 를 들 어 Socket 통신 을 사용 할 수도 있 고 웹 서 비 스 를 사용 할 수도 있 기 때문에 소 개 를 많이 하지 않 습 니 다.
프로그램 에서 native 키 워드 를 보 았 다 면 자바 가 할 수 있 는 일이 아니 라 로 컬 방법 라 이브 러 리 를 불 러 와 야 완성 할 수 있 습 니 다.
로 컬 방법 스 택:Native Method Stack 에 native 방법 을 등록 하고 Execution Engine 이 실 행 될 때 로 컬 방법 라 이브 러 리 를 불 러 옵 니 다.말하자면 로 컬 방법 은 로 컬 방법 스 택 에서 등록 하고 자바 의 방법 은 자바 스 택 에서 등록 하 는 것 이다.
4.PC 레지스터(Program Counter Register)
모든 스 레 드 에는 프로그램 카운터 가 있 습 니 다.스 레 드 의 개인 적 인 것 입 니 다.바로 지침 입 니 다.방법 구역 을 가리 키 는 방법 바이트 코드(다음 명령 을 가리 키 는 주 소 를 저장 하고 곧 실 행 될 명령 코드 를 저장 합 니 다)는 실행 엔진 에서 다음 명령 을 읽 습 니 다.아주 작은 메모리 공간 입 니 다.거의 무시 할 수 있 습 니 다.
이 메모리 영역 은 매우 작 습 니 다.현재 스 레 드 에서 실행 되 고 있 는 바이트 코드 의 줄 표시 기 입 니 다.바이트 디 스 플레이 기 는 이 카운터 의 값 을 바 꾸 어 다음 실행 할 바이트 코드 명령 을 선택 합 니 다.
만약 네 이 티 브 방법 을 실행 했다 면,이 계산 기 는 비어 있 었 을 것 이다.
PC 레지스터 는 분기,순환,점프,이상 처리,스 레 드 복구 등 기본 기능 을 완성 하 는 데 사용 된다.사용 하 는 메모리 가 작 기 때문에 메모리 넘 침(OutOf Memory)오류 가 발생 하지 않 습 니 다.
JVM 의 체계 적 구 조 를 초보 적 으로 인식 하 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 JVM 과 관련 된 체계 적 구조 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기