클래스 로딩
클래스로드는 클래스 .class 파일에서 이진 데이터를 메모리에 읽고 런타임 데이터 영역의 메소드 영역에 넣은 다음 힙 영역에서 java.lang.class 객체를 작성하여 데이터 구조를 캡슐화하는 것을 말합니다. 방법 영역의 클래스.
.class 파일을로드하는 방법 :
1. 로컬 시스템에서 직접로드하십시오
2. 인터넷을 통해 .class 파일을 다운로드하십시오
3. zip, jar 등의 클래스 파일을로드합니다.
4. 독점 데이터베이스에서 .class 파일을 추출합니다
5. Java 소스 파일을 .class 파일로 동적으로 컴파일합니다
클래스 로딩의 최종 제품은 힙 영역에 위치한 클래스 객체입니다.
클래스 객체는 메소드 영역에서 클래스의 데이터 구조를 캡슐화하고 Java 프로그래머에게 메소드 영역의 데이터 구조에 액세스 할 수있는 인터페이스를 제공합니다.
클래스 로더 로더에는 두 가지 유형이 있습니다.
1. Java Virtualizer와 함께 제공되는 로더
루트 클래스 로더 (부트 스트랩)
확장 클래스 로더 (확장)
시스템 클래스 로더 또는 애플리케이션 로더 (시스템)
후자의 두 로더는 Java로 구현되며 루트 클래스 로더는 C ++로 작성되며 프로그래머는 Java 코드 로이 클래스를 얻을 수 없습니다.
2. 사용자 정의 클래스 로더
java.lang.classloader의 서브 클래스
사용자는 클래스의 로딩 방법을 사용자 정의 할 수 있습니다
클래스 로더는 클래스가 먼저 적극적으로 사용될 때까지 기다릴 필요가 없습니다.
JVM 사양은 클래스 로더가 클래스가 사용될 때 클래스를 사전로드 할 수있게합니다. 오류 (LinkageError)를보고하십시오. 이 클래스가 프로그램에서 적극적으로 사용하지 않은 경우 클래스 로더는 오류를보고하지 않습니다.
클래스 제거 메커니즘
클래스의 수명주기. 샘플 클래스가로드, 연결 및 초기화되면 수명주기가 시작됩니다.
샘플 클래스를 나타내는 클래스 객체가 더 이상 참조되지 않을 때, 즉 접촉 할 수없고, 클래스 객체가 수명주기를 끝내고, 메소드 영역의 샘플 클래스 데이터도 언로드되어 수명이 끝납니다. 샘플 클래스의 사이클.
클래스가 끝나면 수명주기가 수명주기를 나타내는 클래스 객체가 수명주기를 종료하는 시점에 의존한다는 것을 알 수 있습니다.
참조 관계 로더 및 클래스 객체 :
클래스 로더의 내부 구현에서 Java 컬렉션은로드 된 클래스에 대한 참조를 저장하는 데 사용됩니다.
반면에 클래스 객체는 항상 클래스 로더를 참조합니다. 클래스 로더를 얻으려면 클래스 객체의 getClassLoader () 메소드를 호출하십시오.
클래스 인스턴스와로드를로드하는 로더 사이에 양방향 관계가 있음을 알 수 있습니다.
클래스 객체, 클래스 객체, 클래스 인스턴스 객체 :
클래스 인스턴스는 항상 클래스를 나타내는 클래스 객체를 말합니다.
getClass () 메소드는 객체 클래스에 정의되어 있으며, 이는 객체가 속한 클래스를 나타내는 클래스 객체에 대한 참조를 반환합니다.
또한 모든 Java 클래스에는이 클래스를 나타내는 클래스 객체를 참조하는 정적 속성 클래스가 있습니다.
수업을 제거합니다
Java Virtual Machine과 함께 제공되는 클래스 로더가로드 한 클래스는 가상 머신의 수명주기 동안 제거되지 않습니다.
앞에서 언급했듯이 Java 가상 머신과 함께 제공되는 클래스 로더에는 루트 클래스 로더, 확장 클래스 로더 및 시스템 클래스 로더가 포함됩니다.
Java Virtual Machine 자체는 항상 이러한 클래스 로더를 참조하고,이 클래스 로더는 항상로드 클래스의 클래스 객체를 참조하므로 이러한 클래스 객체는 항상 액세스 할 수 있습니다.
사용자 정의 클래스 로더가로드 한 클래스를 내릴 수 있습니다.
구체적인 예
loader1 변수 및 OBJ 변수는 샘플 클래스를 나타내는 클래스 객체를 간접적으로 적용하고 OBJClass 변수는 직접 참조합니다.
프로그램 작동 중에 위 그림의 왼쪽에있는 세 가지 참조 변수가 널로 설정되면 샘플 객체가 수명주기를 종료하고 MyClassLoader 객체가 수명주기를 종료하고 샘플 클래스를 나타내는 클래스 객체도 수명을 끝냅니다. 사이클. 샘플 클래스는 내부의 이진 데이터가 언로드됩니다.
다시 필요한 경우 샘플 클래스의 클래스 객체가 존재하는지 확인하면 샘플 클래스가 존재하지 않으면 새 대표가 다시로드됩니다. 샘플 클래스의 클래스 인스턴스의 힙 영역에서 생성됩니다 (해시 코드를 통해 동일한 인스턴스인지 확인할 수 있습니다).