수업은 어떻게 로드되나요?

Java에서 클래스 로딩 프로세스에는 "클래스 로딩 메커니즘"이라는 특수 메커니즘이 있습니다. 클래스 로딩 메커니즘은 JVM(Java Virtual Machine)에서 클래스의 실행 과정을 말하며 자바 프로그램의 정상적인 실행을 위한 핵심이기도 합니다.그 구체적인 실행 과정은 무엇입니까? 다음에 살펴보겠습니다.

프로세스 개요

JVM에서 클래스 로딩은 다음 5단계를 거칩니다.

  1. 로딩 단계(Loading)
  2. 검증 단계(Verification)
  3. 준비
  4. 해결 단계(Resolution)
  5. 초기화 단계(Initialization)

그 중: 확인 단계, 준비 단계 및 구문 분석 단계를 총칭하여 연결 단계라고 부르므로 위의 다섯 단계는 세 가지 범주로 나눌 수 있습니다.

  1. 로딩 단계(Loading)
  2. 연결 단계(Linking)
    1. 검증 단계(Verification)
    2. 준비
    3. 해결 단계(Resolution)
  3. 초기화 단계(Initialization)

구체적인 분류는 아래 그림에 나와 있습니다. 이미지.png이 3가지 범주와 5가지 프로세스의 구체적인 구현 세부 사항은 다음과 같습니다.

1. 로딩 단계

간단히 말해서 로드 단계는 클래스 파일을 메모리에 로드하는 프로세스입니다 . 로딩 단계에서 JVM은 다음 3가지 작업을 수행해야 합니다.

  1. 정규화된 이름으로 이 클래스를 정의하는 이진 바이트 스트림을 가져옵니다.

  2. 이 바이트 스트림이 나타내는 정적 저장 구조를 메서드 영역의 런타임 데이터 구조로 변환합니다.

  3. 메서드 영역에서 이 클래스의 다양한 데이터에 대한 액세스 항목으로 메모리에서 이 클래스를 나타내는 java.lang.Class 객체를 생성합니다.

    2. 연결 단계

    연결 단계는 다시 확인 단계(Verification), 준비 단계(Preparation) 및 해결 단계(Resolution)로 나뉘며 구체적인 실행 세부 사항은 다음과 같습니다.

    2.1 검증 단계

    검증 단계는 검증 단계라고도 하며 주로 메모리에 로드된 클래스가 안전하고 호환되는 파일인지 검증하는 데 사용됩니다. 다음 세부 사항을 기억할 수 없습니다) :

  • 파일 형식 확인에는 상수 풀의 상수 유형, Class 파일의 각 부분이 삭제되었는지 또는 다른 정보가 추가되었는지 여부 등이 포함됩니다.

  • 메타데이터 검증에는 상위 클래스 정확성 검증(최종으로 상위 클래스 수정 여부 확인), 추상 클래스 검증 등이 포함됩니다.

  • 바이트코드 확인, 이 단계는 가장 중요하고 복잡하며 주로 프로그램의 의미 체계가 합법적이고 논리적인지 확인하는 데 사용됩니다.

  • 符号引用校验,对类自身以外比如常量池中的各种符号引用的信息进行匹配性校验。

    2.2 准备阶段

    准备阶段就开始给类中的静态变量设置默认值了,注意这里不是给静态变量设置初始值,而是设置默认值,二者还是有很大区别的。 举个例子,比如代码中写的内容是:

    public static int number = 10;

那么此时是给 number 变量设置的 int 值是默认值 0,而非初始值 10。

2.3 解析阶段

解析阶段就是将常量池中的符号引用更换成直接引用了,所谓的符号引用是指以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可;而直接引用是可以直接指向目标的指针、相对偏移量或者是一个能间接定位到目标的句柄。 符号引用和直接引用有一个重要的区别:使用符号引用时被引用的目标不一定已经加载到内存中;而使用直接引用时,引用的目标必定已经存在虚拟机的内存中了。

3.初始化阶段

初始化阶段,Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。到这一步骤之后,类的加载过程就算正式完成了,此时会给静态变量设置初始值,并执行静态代码块的内容。

总结

类加载流程总共分为 3 大类,5 个主要流程:

  1. 加载阶段(Loading):将类文件加载到内存。
  2. 连接阶段(Linking)
    1. 验证阶段(Verification):类文件安全性效验。
    2. 准备阶段(Preparation):给静态变量设置默认值。
    3. 解析阶段(Resolution):将符号引用转换为直接引用。
  3. 初始化阶段(Initialization):执行静态代码块和给静态变量设置初始值。

이 기사는 Redis, JVM, 동시성, 동시성, MySQL, Spring, Spring MVC, Spring Boot, Spring Cloud, MyBatis, 디자인 패턴, 메시지 큐 및 기타를 포함하는 Gitee 오픈 소스 웨어하우스 "Java 인터뷰 가이드"에 포함되었습니다. 모듈. Java 인터뷰에 충분합니다. 자세한 내용을 보려면 클릭하십시오: 인터뷰: 400개 이상의 일반적인 Java 인터뷰 질문 및 분석, 지속적으로 업데이트됨......

おすすめ

転載: juejin.im/post/7193528484566663226