[가져 오기] JVM은 면접관 인터뷰 : 이야기 JVM 클래스 로더 프로세스가 무엇입니까?

클래스로드

클래스 파일이 가상 머신과 사용 후 실행에로드 할 필요가, 가상 머신이 클래스는 이러한 문서를로드하는 방법은?

주요 세 단계 시스템은 파일 유형 클래스로드하려면 로드 -> 연결 -> 초기화 . : 연결 과정은 세 단계로 나눌 수 있습니다 -> 준비 -> 해결 확인합니다 .

클래스로드

하중

클래스 로딩하는 과정의 첫 번째 단계는, 주로 다음 세 가지를 완료합니다 :

  1. 이러한는 바이너리 바이트 스트림의 전체 클래스 이름으로 정의 포착 된
  2. 런타임 데이터 구조 영역 법에 의해 표시되는 바이트 스트림 정적 저장 구조 변환
  3. 데이터 입력 영역에 대한 접근 방법으로서, 메모리에 클래스 클래스 오브젝트의 대표 생성

가상 머신 스펙 개 이상의 점을 상기 특정 때문에 매우 유연하지 않습니다. 예를 들어 "같은 바이너리 바이트 스트림의 정의의 전체 클래스 이름을 취득하여"어떻게 얻는 특정을 얻을 위치를 지정하지 않습니다. 예를 들어 : 더 일반적인 다른 파일 생성 (일반 응용 프로그램이 JSP이다) 등의 ZIP 패키지에서 (미래 나타납니다, EAR, WAR 형식에 대한 JAR 기준)을 읽는 것입니다.

비 - 로딩 위상 배열 클래스 (클래스 로딩 위상 획득 동작 이진 바이트 스트림) 우리는 바이트 스트림을 획득하는 방식을 제어하기 위해 클래스 로더를 정의 할 수이 단계를 완료하기 위해, 제어 강한 스테이지 인 (클래스 로더 대체 방법). 배열 유형은 자바 가상 머신에 의해 직접 생성 한 클래스 로더에 의해 만들어지지 않습니다.loadClass()

부모 클래스 로더 위임 모델은이 부분에 대한 별도의 문서의 뒷부분에 소개합니다, 또한 매우 중요한 지식입니다.

부품 로딩 단계와 연결 단계는 크로스로드 단계는 아직 끝나지, 무대 수있는 연결이 이미 시작되지 않은 실시한다.

확인

검증 상태도

준비된

준비 단계 공식적 클래스 변수를위한 메모리를 할당하고, 스테이지 클래스 변수의 초기 값이 설정되어 ,이 메모리에있어서의 영역에 할당 될 것이다. 다음 사항이 단계에 관심을 지불 할 필요가 :

  1. 이 시간은 메모리 할당 클래스 변수 (정적)을 포함하고, 오브젝트가 인스턴스화 될 때 자바 객체로 할당 힙의 인스턴스 변수, 인스턴스 변수를 포함하지 않는다.
  2. 여기서 "일반적인 경우"의 초기 값의 집합은 제로 (예를 들어, 0,0L, NULL, 오류 등), 우리는 예를 들어, 정의는 기본값의 데이터 형식 인 public static int value=111준비 단계 (111)에서, 변수 값의 초기 값은 0이 아닌 ( 초기화 단계)이 할당 될 것이다. 특별한 경우를 예를 들어, 부가 fianl 주요 변수로 public static final int value=111다음 제조 단계의 값의 값이 111으로 설정 하였다.

기본 데이터 타입의 제로 값 :

기본 데이터 타입의 제로 값

해결

단 파싱하는 직접 참조를 대체하는 과정을 참조 기호 상수 풀로 가상 머신이다. 클래스 또는 인터페이스, 필드, 메소드 클래스 인터페이스에있어서, 입력 방법 및 레퍼런스 심볼에 대한 호출 방법 핸들 7 클래스 한정자의 주요 분석 동작.

심볼 기준은 임의의 문자 일 수 대상을 설명하기 위해 심볼의 세트이다. 직접 참조는 객체, 측위 대상 핸들 간접 또는 상대적 오프셋에 직접 포인터이다. 실제 프로그램은, 상징적 참조를 실행에 예를 들어, 충분하지 않습니다 : 프로그램 실행 방법 중에, 시스템은이 방법의 정확한 위치를 위치를 알 필요가있다. 각 클래스의 자바 가상 머신 매장 클래스에 테이블 방법을 모든 방법을 준비했다. 당신은 클래스 메소드를 호출 할 필요가있을 때,만큼 사각 테이블의 오프셋 (offset)이 방법을 직접 방법이 호출 할 수 있습니다 알고있다. 기준 심볼 위치에 의해 파싱 동작 직접 메소드가 호출 될 수있다도록, 클래스의 메소드 테이블에서 목표 방법으로 변환 할 수있다.

요약하면, 분석 단계는 가상 기계 프로세스의 상수 풀을 참조 기호들 직접 치환 또는 필드 클래스, 메소드를 획득하거나 메모리 오프셋 포인터이다.

초기화

마지막 단계는 클래스 로딩을 초기화하고, 또한, 초기화 단계에서 정의 된 실제 자바 코드 (바이트 코드) 클래스는 클래스 생성자 행한다 행하는 처리 방식. ()

를 들어 메소드 호출, 가상 머신 자체가 다중 스레드 환경에서의 안전을 보장합니다. 때문에 방법은 스레드 안전 잠금, 그래서 그것은 클래스 초기화는 교착 상태가 발생할 수 있습니다, 다중 스레드 환경에서이며,이 교착 찾기가 어렵습니다. () ()

초기화 단계의 경우, 엄격하게 가상 머신과 5 케이스를 조절, 클래스가 초기화해야합니다 :

  1. 직면하면 이러한 새로운 클래스로 직접 또는 invokestatic (이) 코드 명령은 정적 필드 (되지 최종 변경), 또는 클래스에 정적 메소드 호출을 읽을 때 4 putstatic, getstatic, 새로운.
  2. 사용 java.lang.reflect패키지 방식이 아닌 클래스의 초기화가 초기화를 실행하는 데 필요한 경우, 반영하기 위해 클래스를 호출 할 때.
  3. 부모 클래스가 초기화되어 있지 않은 경우, 클래스를 초기화, 부모 클래스의 첫 번째 트리거 초기화.
  4. 가상 기계가 시작할 때, 사용자는 (클래스의 주요 방법 포함)을 실행하는 마스터 클래스이 클래스를 초기화하는 가상 머신을 정의 할 필요가있다.
  5. 최종 해상도 구조 MethodHandle 인스턴스가 REF의 경우 동적 JDK1.7의 동적 언어가 언제 getstatic 상기 REF putstatic, REF_invokeStatic, 상기 방법은 핸들이 핸들이 초기화되지 않으며, 이는 플립 플롭을 초기화 할 필요가있다.

참고

  • "자바 가상 머신에 대한 심층 이해"
  • "실질적으로 자바 가상 머신"

오픈 소스 프로젝트는 권장

다른 오픈 소스 프로젝트의 추천 :

  1. JavaGuide : 자바 학습 [+] 인터뷰 가이드 자바 프로그래머의 대다수가 핵심 지식을 마스터해야 다룹니다.
  2. 가이드 - springboot : 초보자뿐만 아니라 봄 부팅 튜토리얼에 숙련 된 개발자 액세스에 적합한 (여가 시간 관리, 유지 보수가 함께 환영합니다).
  3. 발전 - 프로그래머 : 나는 기술 직원은 좋은 습관을 가지고해야한다고 생각!
  4. - 보안 - JWT-스프링 가이드 : 0에서 시작하기! (검증 기관 포함) 스프링 시큐리티와 JWT 코드의 후단 부분.

있는 공개하지

추천

출처juejin.im/post/5dff0ff26fb9a016536ec3c6