JVM은 구조의 링크에 의해 실행되는 Java 프로그램으로부터 제조

JVM은 구조의 링크에 의해 실행되는 Java 프로그램으로부터 제조


> 컴파일러 프론트 엔드 - 1.java 자바 프론트 엔드 컴파일러는 바이트 코드에 소스 코드를 컴파일 할 책임이있다

2.java 가상 머신 내부로 컴파일로드 바이트 코드에 대한 책임 -> 동작 영역 및 클래스 자바를로드하는 단계

클래스로드 :로드, 링크 초기화

로드 : 클래스 로딩 단계는 클래스의 정규화 된 이름에 따라 같은 바이너리 바이트는 JVM 내부 흐름 읽기 클래스 로더의 책임이다 , 방법과 영역에서의 런타임 메모리 영역에 저장 한 다음로 변환 a를 대상 유형 java.lang.Class의 객체 인스턴스에 대응하는 액세스 방법 입력 영역 다양한 데이터 클래스와 미래의 클래스 오브젝트된다.
링크 : JVM에서 동작 상태로의 정보의 이진 데이터 바이트 스트림 클래스의 JVM으로로드 될 , 접속 인증에 의한 위상 및 분석은 세 단계로 구성을 준비한다. 검증 단계의 주요 작업은 데이터가 JVM 사양을 입력 여부를 확인하는 것입니다. 준비 단계의 주요 작업은 모든 정적 변수 클래스의 메모리 공간을 할당하고, 초기 값을 설정하는 것이다. 단계 구문 분석하는 모든 기호 상수 풀 참조는 모두 직접 참조로 변환. 해상도 단계는 다음 초기화 후까지 수행 할 수 있도록하지만, JVM 스펙은 특정 순서에 따라 해결 단계의 구현을 제공하지 않습니다.
초기화 : JVM이 확인 된 모든 정적 코드 또는 코드 블록 키워드를 모두 다시 수행 클래스에있을 것입니다.

클래스 로더


부트 스트랩 클래스 로더는 부트 로더는 "JAVA_HOME / lib에"디렉토리의 모든 유형을로드에 대한 책임이 될
은 "JAVA_HOME / lib 디렉토리 / 내선"확장 디렉토리를로드하는 ExternalClassLoader 책임을 모든 종류의
다음 클래스 경로를로드하는 appClassLoader 책임을 모든 종류의

부모 위임 모델

부모 위임 모델 (부모 위임 모델) :

로드 클래스는 더 나은 자바 플랫폼의 안전을 보장 할 수 있습니다 부모 위탁 메커니즘을합니다.
이 모델은 또한 정상 부트 스트랩 클래스 로더 부트 클래스 로더, 자신이 있어야 클래스 로더의 나머지가 필요합니다 父类加载器. 아동 및 부모 클래스 로더 클래스 로더는 不是以继承(Inheritance)的关系달성하지만 것입니다 组合(Composition)关系부모 로더 다중화 코드. 각 클래스 로더는 (로더와 같은 네임 스페이스에있는 모든 부모 클래스 로더로드 된 클래스의 클래스 이름의 패키지를 포함하여 (완전 표시되지 않습니다) 같은 자신의 네임 스페이스가 두 클래스는, 다른 네임 스페이스에서) 같은 클래스의 두 (의 패키지 포함) 전체 클래스 이름이있을 수 있습니다

부모는 다음과 같이 프로세스 모델은 위임 할 수 있습니다 :

1. 이미 직접 원래 이미로드 된 클래스에로드 된 경우 등이로드 된 자신의 이미로드 된 클래스에서 현재 클래스 로더 첫번째 쿼리를 수행합니다.

每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存, 等下次加载的时候就可以直接返回了。 

2. 현재 클래스 로더, 동일한 전략을 사용하여 부모 클래스 로더는, 먼저, 캐시를 확인 부하에 상위 클래스의 부모 클래스를 위임 부하에 부모 클래스 로더에 의해 의뢰, 캐시로드 클래스에서 찾을 수없는,있다 부트 스트랩에 클래스 로더에.
모든 부모 클래스 로더가로드 한 후 현재의 클래스 로더에 의해로드 및 자체 캐시에 저장되지 않은 3, 그래서 다음 번에 직접 부하 요청 복귀있다.

: 클래스 로더 사이의 관계를 정리하기 위해이 모델을 사용의 이점
을 중심으로 安全性뿐만 아니라 피하려면, 동적 피하기 사용자가 작성한 자바 클래스와 같은 문자열과 같은 일부 핵심 클래스를 대체 重复加载JVM이, 다른 클래스 사이뿐만 아니라 구별 할 수 있기 때문에, 그냥 클래스 이름을 기반으로 두 개의 서로 다른 클래스를로드, 같은 클래스 파일을 다른 클래스 로더는 상호 변환하는 경우, 다음 java.lang.ClassCaseException 발생합니다.

사용자 정의 클래스 로더

만 추상 클래스의 클래스 로더를 상속하고 다시 작성해야 (때문에) findClass을 () 메소드가 될 수 있습니다. 클래스에서 사용되는 클래스의 인스턴스로 판독 들어오는 이진 배열 변환 defineClass는 () 메소드.

3. 마지막으로 해석 / 해당 플랫폼에서 실행되는 기계 명령어로 컴파일 -> JVM 실행 엔진과 가비지 컬렉션 (GC)

 자바 바이트 코드입니다 실행 : 두 가지 방법으로
  1 인 - 타임 컴파일러 방식 : 기계 코드로 제 1 통역자 바이트 코드 컴파일러를하고 기계 코드를 실행. 
  2. 해석 실행 모드 : 통역 해석하고 실행하는 의해 코드의 각 조각은 자바 바이트 코드 프로그램의 모든 작업을 수행 할 수 있습니다. 

기본이며 오픈 JDK 핫스팟 VM JDK는 가상 머신이 함께 제공됩니다. 핫스팟 VM 내에서 시간 컴파일러와 공존 통역. 이 때문입니다 가상 머신에 전원이 공급 될 때, 인터프리터가 실행하기 전에 모든이 완료 컴파일 컴파일러 기다리지 않고 먼저 일을 할 수 있도록 불필요한 컴파일 시간을 많이 절약 할 수 있습니다. 이상과 프로그램 실행 시간, 점진적으로 기능 컴파일러, 프로그램 실행의 높은 효율에 대한 대가로 기본 기계 명령어로 컴파일 값 (자주 호출 방법) 바이트 코드에 따라 고온 감지 기능.



게시 된 159 개 원래 기사 · 원 찬양 75 · 전망 190 000 +

추천

출처blog.csdn.net/xuehuagongzi000/article/details/70054576