>  기사  >  Java  >  면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)

면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)

Java后端技术全栈
Java后端技术全栈앞으로
2023-08-23 15:05:471586검색

Loading

클래스를 사용하려면 ClassLoader를 통해 클래스를 메모리에 로드해야 합니다

"클래스 로딩 단계는 주로 다음 세 가지를 완료합니다."

  1. 전체 클래스 이름을 통해 클래스의 바이너리 스트림을 가져옵니다
  2. 클래스의 바이너리 스트림을 메소드 영역의 데이터 구조로 구문 분석합니다.
  3. 표현할 java.lang.Class 클래스의 인스턴스를 생성합니다. 유형, 메소드 영역 이 클래스 액세스 입구
면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)

"전체 클래스 이름을 통해 클래스의 바이너리 스트림을 얻는 방법은 여러 가지가 있습니다."

  1. zip 패키지에서 가져오기
  2. 네트워크에서 가져오기
  3. 동적 프록시 기술과 같은 런타임 계산 생성
  4. ...

"배열이 아닌 유형의 로딩 단계의 경우 내장된- Java 가상 머신의 클래스 로더에서 완료하거나 사용자 정의 클래스 로더를 사용하여 완료할 수 있습니다."

Link

"이번 연결 단계는 크게 검증, 준비, 분석 3단계로 나누어집니다."

검증

" 검증단계는 주로 클래스 파일 형식이 올바르고 실행 시 가상 머신의 보안을 위협하지 않는지 확인하기 위한 것입니다."

검증 단계에는 많은 규칙이 있지만 대략 다음 네 단계로 나뉩니다면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개) "구체적인 내용은 자세히 설명하지 않겠습니다." "Java Virtual Machine에 대한 심층적인 이해"를 참조하세요. 이 기사에서는 메모리 할당에 대한 자세한 내용을 설명하지 않고 요약하고 클래스 로딩의 전체 과정을 파악하는 것을 선호합니다. 클래스의 정적 변수에 대해 기본값으로 초기화합니다."

공통 데이터 유형의 기본값은 다음과 같습니다
데이터 유형 기본값
byte (바이트)0
short (short)0
int 0
길게 0L
float 0.0f
double 0.0d
boolean false
char 'u0000'
reference null

"클래스 정적 변수의 필드 속성 테이블에 ConstantValue 속성이 존재하면 대입문이 직접 실행됩니다."

그러면 어떤 상황에서 클래스 정적 변수의 필드 속성 테이블에 ConstantValue 속성이 존재합니까? ?

  1. Class 정적 변수는 기본 데이터형으로 final로 수정됩니다
  2. Class 정적 변수는 String형으로 final로 수정되며 리터럴 형태로 값이 할당됩니다

순서 클래스 파일 코드의 바이트를 쉽게 볼 수 있도록 IDEA에서 플러그인 jclasslib 바이트코드 뷰어를 다운로드했는데 이는 매우 편리했습니다. 다음 코드를 사용하여 바이트코드 형식으로 검증합니다

public class Person {

    private static int age = 10;
    private static final int length = 160;
    private static final String name = "name";
    private static final String loc = new String("loc");
}

면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)"따라서 길이 및 이름 속성은 준비 단계에서 ConstantValue에서 지정한 값이 할당됩니다."

"그러면 어느 단계에서 age 및 loc 속성이 할당됩니까? 초기화 단계입니다. 이에 대해서는 나중에 자세히 소개하겠습니다. 클래스, 인터페이스, 필드 및 메소드를 직접 참조로 》기호 참조: 기호 세트를 사용하여 참조된 대상을 설명합니다. 직접 참조, 대상에 대한 직접 포인터면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)

저와 함께 다음과 같이 클래스를 작성하세요

public class Student {

    private String name;
    private int age;

    public String getName() {
        return this.name;
    }
}
필드를 예로 들면 이름과 나이에 해당하는 객체는 메모리 주소를 직접 가리키지 않고 문자열로 설명됩니다( 즉, 상징적 참조). 구문 분석 단계는 이러한 설명을 대상을 직접 가리키는 포인터(즉, 직접 참조)로 변환하는 것입니다

初始化

「执行类静态成员变量赋值语句和静态代码块中的语句」

면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)

我们把上面的Student代码改成如下形式

public class Student {

    private String name;
    private int age = 10;
    private static int gender = 1;

    {
        System.out.println("构造代码块");
    }

    static {
        System.out.println("静态代码块");
    }

    public Student() {
        System.out.println("构造函数");
    }

    public String getName() {
        return this.name;
    }
}

可以看到字节码中包含了3个方法,getName方法我们知道,7e51f00a783d7eb8f68358439dee7daf和583d030be372af71281df966e84181a5方法里面执行了哪些逻辑?면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)从字节码的角度分析一波

「7e51f00a783d7eb8f68358439dee7daf方法」

면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)

从字节码可以看到7e51f00a783d7eb8f68358439dee7daf方法的主要逻辑为

  1. 调用父类的7e51f00a783d7eb8f68358439dee7daf方法
  2. 非静态成员变量赋值
  3. 执行构造代码块
  4. 执行构造函数

면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)「583d030be372af71281df966e84181a5方法」면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)从字节码可以看到583d030be372af71281df966e84181a5方法的主要逻辑为

  1. 정적 변수의 할당 문 실행
  2. 정적 코드 블록의 문 실행
  3. 한 가지 주의할 점은 "Java Virtual Machine은 하위 클래스의 메서드 이전에 가 실행되면 상위 클래스의 f7729255ed3b5adeaf95ded0aa3581a1메서드가 실행되었습니다."

"몇 가지 인터뷰 질문이 종종 있기 때문에 583d030be372af71281df966e84181a5 및 7e51f00a783d7eb8f68358439dee7daf 메소드의 역할을 이해하는 것이 필요합니다. 정적 코드 블록, 생성된 코드 블록 및 생성된 함수의 실행 순서 "

여기에 결론을 직접 요약하겠습니다. 데모를 작성하여 확인할 수 있습니다.

"상속 없는 실행 순서"

  1. 정적 코드 블록 및 정적 멤버 변수, 실행 순서는 쓰기 순서에 따라 결정됩니다(한 번만 실행됩니다).
  2. 코드 블록 및 비정적 멤버 변수를 구성하면 쓰기 순서에 따라 실행 순서가 결정됩니다.
  3. 생성자

"상속을 통한 실행 순서"

  1. 부모 클래스의 정적(정적 코드 블록, 정적 멤버 변수), 하위 클래스의 정적(정적 코드 블록, 정적 멤버 변수)( 한 번만 실행됨)
  2. 부모 클래스의 비정적(구성된 코드 블록), 비정적 멤버 변수), 부모 클래스의 생성자
  3. 비정적(구성 코드 블록, 비정적) -정적 멤버 변수) 하위 클래스의 생성자

Unloading

가비지 수집은 힙뿐만 아니라 메서드 영역에서도 발생합니다. 그런데 메소드 영역에서 타입 데이터를 재활용하기 위한 조건이 꽤 까다롭습니다면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)다음 그림은 메소드 영역에서 Simple 클래스를 재활용하고 싶은 예시입니다

  1. 샘플 클래스와 힙의 하위 클래스가 재활용되었는지 확인해야 합니다
  2. Sample 클래스를 로드하는 MyClassLoader가 재활용되었습니다.
  3. Sample 클래스에 해당하는 클래스 개체가 재활용되었습니다면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)

메서드 영역에서 타입 데이터를 재활용하는 조건은 상대적으로 가혹하지만 결과가 미미하기 때문에 일부 가비지 컬렉터는 메소드 영역에서 타입 데이터를 재활용하지 않는 것을 볼 수 있습니다

요약

클래스 로딩 과정면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)

변수 할당 과정면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)

위 내용은 면접관: 클래스 로딩 과정에 대해 알려주세요(다이어그램 10개)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Java后端技术全栈에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제