좋은 프로그래머 점유율 JVM 자바 클래스 로딩 메커니즘

JVM 관련 개념

  • 의 JDK 로 <br> 의 JDK (자바 개발 키트) 자바 개발 키트, 컴파일 및 프로그램의 디버깅을위한 일련의 절차 자바 개발자의 모음입니다.

  • JRE 로 <br> JRE (자바 런타임 Evironment) 자바 런타임 환경은 Java 프로그램을 실행하기위한 플랫폼으로, 모든 Java 프로그램은이 플랫폼에서 실행할 수 있습니다.

  • JVM은 <BR> 자신뿐만 아니라, 등 프로세서, 스택, 레지스터, :, 그것은 같은 고유의 하드웨어 아키텍처를 가지고 컴퓨터에 의해 수행되는 기능을 시뮬레이션하는 가상 컴퓨터 코드 중 인 JVM (자바 가상 머신) Java 가상 머신을, 다른 운영 체제에서 명령의 세트가 자바 프로그램은 서로 다른 운영 체제에서 실행할 수 있도록 JVM 설치 될 수있다, JVM은 자바의 크로스 플랫폼 기능을 달성하는 것입니다.

JVM 클래스 로딩 과정

우리는 당신이 컴파일하고 실행해야하는 자바 프로그램의 실행을 개발, JVM이 클래스를 로딩하는 과정에 대한 책임이 있습니다. 로 <br> 프로세스 클래스 로더로 나누어 져 있습니다 :

  1. 하중

  2. 확인

  3. 준비된

  4. 결심

  5. 초기화

상세한 클래스 로딩 절차

이러한 절차에 따라 다음과 같은 세부 정보 :

  1. 로드 로 <br> 완료 클래스를 로딩하는 과정에서 :

    1. 한정자 클래스의 전체 이름에 따르면, 스트림, 디스크의 클래스에서 얻은 jar 파일은, 또한 네트워크에서 얻을 수 있습니다, 클래스 이진 스트림을 구하십시오.

    2. 동적 저장 구조의 경우에있어서의 영역에 정적 스토리지 동작 클래스의 구조

    3. 힙 메모리에서 입구 영역과 같은 방법을 대응 java.lang.Class의 객체를 생성 할

  2. 확인 로 <br> 완료 클래스를 로딩 한 후, 이전 Class 객체에서 생성 된 정보는 JVM의 안전을 위태롭게하지 않을 것이라는 보장 검증 프로세스를 입력합니다. 로 <br> 측면을 검증 할 필요가 있습니다 :

    1. 파일 형식 유효성 검사 사양 클래스의 바이트 스트림 파일 형식의 준수를 확인하고, 가상 머신 처리의 현재 버전이 될 수 있습니다. 매직 넘버는 0xCAFEBABE 여부를 확인하기 위해 상기 메이저와 마이너 버전 번호는 현재 가상 기계 가공 범위이다 등등 상수 풀에 일정한 지원되지 일정한 타입이있는 경우, 주요 목적은 검증 단계 입력 바이트를 보장하는 것이다 후자의 세 가지 기초되었는지 검증 단계 기억 영역 설정 방법이 수행되도록 적절히 분석하고, 처리 영역에 저장된 흐름이 단계에서 인증, 바이트 스트림은 메모리 영역의 기억 수단을 입력한다.

    2. 메타 데이터 확인 정보는 Java 언어 사양을 설명하는 정보의 준수를 보장하기 위해, 바이트 코드 의미 분석을 설명한다. 검증이 포함될 수 있습니다 : 부모 클래스 여부,이 클래스의 부모가 허용되는 상속 클래스를 상속 여부, 클래스, 추상 클래스가 아닌 경우 구현하는지 여부를 부모 클래스 또는 인터페이스 구현 요구 사항의 모든 방법.

    3. 바이트 코드 검증, 주요 작업은 가상 머신의 안전을 위협하는 행위하지 않습니다 런타임에 메서드 검증 클래스를 보장하기 위해 데이터 흐름과 제어 흐름 분석이다. 바이트 코드 방식의 몸이 클래스의 바이트 코드 검증을 통과하지 못하면, 그것은 확실히 문제가 있지만 바이트 코드 검증에 의한 방법 본체는 반드시 안전 설명 할 수없는 경우.

    4. 직접 참조로 상징적 참조,이 전환 조치가 "분석 단계"에서 일어날 때 상징적 참조 검증, 가상 머신에서 개최됩니다. 심볼 기준 클래스 필드 및 메소드, 명명 기관을 참조하여 설명 된 검증 심볼 열은 대응하는 클래스가 발견 될 수 없다면, 방법 지정 필드 기술자 클래스 명, 필드의 간단한 설명 및 준수하는 방법이 존재하는지 현재 클래스에 액세스 할 수 있는지 여부 접근성 (개인, 보호, 공공, 기본값).

  3. 제조 로 <br> 준비 단계 방법은 정적 클래스 변수를위한 메모리 영역을 할당하고 디폴트 값을 할당한다.

    공공 정적 INT 수 = 100;

    예를 들면 : 준비 단계에서 상기 카운트 변수를 0으로 할당하고 초기화시 (100)에 할당한다;

  4. 해결 로 <br> 스테이지를 분석하는 직접 참조를 대체하는 과정을 참조 기호 상수 풀 가상 머신이다.

    • 기준 심볼 (심볼 참조) 로 <br> 참조, 문자 기호에 기재된 심볼들의 특정 세트에 대한 참조 기호는 임의의 형태 일 수 있으며, 한 목적으로 사용 명백하게 위치 될 수있다. 기호 참조가 가상 머신을 달성하기 위해 메모리 레이아웃과는 아무 상관이없는, 목표는 반드시 메모리에로드 된 기준이 아니다.

    • 직접 참조 (직접 참조) 로 <br> 직접 참조 개체에 직접 포인터를 처리 대상 표적 간접적 오프셋 또는 상대적 일 수있다. 메모리 레이아웃에 직접 참조는 사용자가 직접 참조가있는 경우, 대상 참조가 이미 메모리에 존재해야합니다, 가상 머신의 구현과 관련이 있습니다.

  5. 초기화 로 <br> 클래스 초기화 완전히 로딩 단계에서 가상 머신 제어 및 사용자가 어플리케이션에 의해 지배되고, 나머지 작업에 참여하는 자기 한정 클래스 로더 이외 이외에, 클래스로드 처리의 앞에, 클래스를 로딩하는 프로세스의 마지막 단계이다. 초기화 단계에 정말 자바 코드에 정의 된 클래스를 시작했다. 로 <br> 초기화 단계는 클래스 생성자 행한다 <clinit> 처리 () 메소드. <clinit>은 () 메소드는 클래스 및 모든 명령 블록 (정적 {} 블록) 생성 문 병합 정적 변수 컴파일러 등급 할당 동작에 의해 자동으로 수집된다.

    그래서 때 초기화에게 그것을 수행하는?

    1. 클래스의 인스턴스를 생성

    2. 액세스 클래스 (상수, 최종 수정 제외) 정적 변수 이유 : 정수 특별한 변수, 컴파일러는 속성 값보다는 치료로 취급하기 때문이다.

    3. 액세스 클래스 정적 메서드

    4. 리플렉터 (가 Class.forName ( "com.test.Person"))

    5. 클래스를 초기화하는 경우, 클래스는 아직 그의 아버지 초기화, 부모 클래스를 초기화하는 첫 번째 통화를 찾지 못했습니다

    6. 가상 기계가 시작할 때, main () 메소드를 정의하는 클래스를 초기화

코드 케이스

클래스 로딩 메커니즘을 이해, 우리는 얼굴 질문에 보면 :

공용 클래스 MySingleton {  개인 정적 MySingleton 싱글 = 새로운 MySingleton (); 공공의 고정 INT COUNT1 = 0; 공공 정적 INT의 COUNT2; 개인 MySingleton () { COUNT1 ++; COUNT2 ++; } 공용 static MySingleton의 getInstance () { 창 싱글; } 공공 정적 메인 (문자열 []에 args) {공극 MySingleton 싱글 MySingleton.getInstance = (); 에서 System.out.println ( "COUNT1 ->"+ MySingleton.count1); 에서 System.out.println ( "COUNT2 ->"+ MySingleton.count2); } }





















위의 결과는 학생들의 대부분은 두 개의 정적 변수보다 사고의 결과 일 것으로 생각할 수 있습니다 :


COUNT1 -> 0
COUNT2 -> 1

이유는 무엇입니까? 이제 우리는 분석 할 수있다 :

  1. 먼저 우리는 준비 단계 클래스에서 정적 변수에 대한 기본값을 할당합니다 알고 로 <br> 싱글 = NULL; COUNT1 = 0; COUNT2 = 0;

  2. 다음의 getInstance 정적 메소드 호출 클래스 클래스 초기화가 트리거되면, 그 후, 새로운 MySingleton () 생성자 메소드 호출을 수행 <BR> = COUNT1은 1]. COUNT2 = 1].

  3. , COUNT1 0 할당, 초기화 변수에 값을 할당 계속 1 값을 유지하도록 더 할당 COUNT2없고, 그 결과는 다음과 <BR> COUNT1 = 0; COUNT2 = 1;

개요

로딩, 유효성 검사, 준비, 분석, 다섯 단계를 초기화 : JVM은 자신의 하드웨어와 소프트웨어, JVM로드되어 특정로드 프로세스를 실행하는 자바 클래스를 가능하게 컴퓨터 시뮬레이션의 코드입니다.

추천

출처www.cnblogs.com/gcghcxy/p/10974568.html