>  기사  >  Java  >  JVM에서 Java 클래스의 로드 및 언로드 메커니즘 분석

JVM에서 Java 클래스의 로드 및 언로드 메커니즘 분석

高洛峰
高洛峰원래의
2017-01-13 09:35:511301검색

JVM에서 Java 클래스의 로드 및 언로드 메커니즘 분석

클래스 로딩
클래스 로딩은 클래스의 .class 파일에 있는 바이너리 데이터를 메모리로 읽어 들여 런타임 데이터 영역에 배치하는 방식을 말합니다. 그런 다음 힙 영역에 java.lang.Class 객체를 생성하여 메소드 영역에 클래스의 데이터 구조를 캡슐화합니다.

.class 파일 로드 방법:

1. 로컬 시스템에서 직접 로드

2. 네트워크를 통해 .class 파일 다운로드

3. zip, jar 및 기타 아카이브 파일에서 .class 파일 로드

4. 독점 데이터베이스에서 .class 파일 추출

5. Java 소스 파일을 .class 파일로 동적으로 컴파일

클래스 로딩의 최종 결과물은 힙 영역에 위치한 Class 객체입니다.

클래스 객체는 클래스의 데이터 구조를 메소드 영역에 캡슐화하고 Java 프로그래머에게 메소드 영역의 데이터 구조에 액세스할 수 있는 인터페이스를 제공합니다.

JVM에서 Java 클래스의 로드 및 언로드 메커니즘 분석

클래스 로더
로더에는 두 가지 유형이 있습니다.

1. Java 가상 머신과 함께 제공되는 로더

루트 클래스 로더(Bootstrap)

확장 클래스 로더(Extension)

시스템 클래스 로더 또는 애플리케이션 로더(System)

후자의 두 로더는 루트 클래스인 Java로 구현됩니다. 클래스 로더는 C++로 작성되었으며 프로그래머는 Java 코드로 이 클래스를 얻을 수 없습니다.

2. 사용자 정의 클래스 로더

java.lang.ClassLoader의 하위 클래스

사용자가 클래스 로딩 방법을 사용자 정의할 수 있습니다.

클래스 로딩 컴파일러 클래스를 로드하기 전에 처음으로 활발하게 사용될 때까지 기다릴 필요가 없습니다.

JVM 사양에서는 클래스가 사용될 것으로 예상될 때 클래스 로더가 클래스를 사전 로드할 수 있도록 허용합니다. 사전 로드 프로세스 중에 .class 파일이 누락되거나 오류가 있는 경우 클래스 로더를 로드해야 합니다. 오류(LinkageError)는 이 클래스가 적극적으로 사용될 때만 보고됩니다. 클래스가 프로그램에서 활발하게 사용되지 않은 경우 클래스 로더는 오류를 보고하지 않습니다.

클래스 언로드 메커니즘
클래스 수명 주기
Sample 클래스가 로드, 연결 및 초기화되면 수명 주기가 시작됩니다.

Sample 클래스를 나타내는 Class 객체가 더 이상 참조되지 않는 경우, 즉 액세스할 수 없는 경우 Class 객체의 수명 주기가 종료되고 메서드 영역에 있는 Sample 클래스의 데이터도 언로드됩니다. , 따라서 Sample 클래스의 수명이 종료됩니다.

클래스가 수명주기를 종료하는 시점은 해당 클래스를 나타내는 클래스 객체가 수명주기를 종료하는 시점에 따라 달라지는 것을 볼 수 있습니다.

참조 관계
로더 및 클래스 객체:

클래스 로더의 내부 구현에서 Java 컬렉션은 로드된 클래스에 대한 참조를 저장하는 데 사용됩니다.

반면에 클래스 객체는 항상 해당 클래스 로더를 참조합니다. 클래스 로더를 얻으려면 Class 객체의 getClassLoader() 메서드를 호출합니다.

클래스 인스턴스와 이를 로드하는 로더 사이에 양방향 관계가 있음을 알 수 있습니다.

클래스, 클래스의 클래스 객체, 클래스의 인스턴스 객체:

클래스의 인스턴스는 항상 클래스를 나타내는 Class 객체를 참조합니다.

getClass() 메소드는 Object 클래스에 정의되어 있으며, 이 메소드는 객체가 속한 클래스를 나타내는 Class 객체에 대한 참조를 반환합니다.

또한 모든 Java 클래스에는 이 클래스를 나타내는 Class 객체를 참조하는 정적 속성 클래스가 있습니다.

클래스 언로드
Java 가상 머신과 함께 제공되는 클래스 로더에 의해 로드된 클래스는 가상 머신의 수명 주기 동안 언로드되지 않습니다.

앞서 소개한 것처럼 Java Virtual Machine에 포함된 클래스 로더에는 루트 클래스 로더, 확장 클래스 로더, 시스템 클래스 로더가 있습니다.

Java 가상 머신 자체는 항상 이러한 클래스 로더를 참조하고 이러한 클래스 로더는 항상 자신이 로드하는 클래스의 클래스 객체를 참조하므로 이러한 클래스 객체는 항상 접근 가능합니다.

사용자 정의 클래스 로더에 의해 로드된 클래스는 언로드될 수 있습니다.

구체적 예시

JVM에서 Java 클래스의 로드 및 언로드 메커니즘 분석

loader1 변수와 obj 변수는 Sample 클래스를 나타내는 Class 객체를 간접적으로 적용하고, objClass 변수는 이를 직접 참조한다.

프로그램 실행 중에 위 그림의 왼쪽에 있는 세 가지 참조 변수가 모두 null로 설정되면 Sample 개체의 수명 주기가 종료되고 MyClassLoader 개체의 수명 주기가 종료되며 Sample 클래스를 나타내는 클래스 객체도 수명 주기를 종료하면 메서드 영역에 있는 Sample 클래스의 이진 데이터가 언로드됩니다.

다시 필요할 때 Sample 클래스의 Class 객체가 있는지 확인합니다. 존재하면 다시 로드하지 않고 바로 사용하고, Sample 클래스가 없으면 새로 로드합니다. Java 가상 머신의 힙 영역에 생성된 새로운 Class 인스턴스는 Sample 클래스를 나타냅니다(해시 코드를 통해 동일한 인스턴스인지 확인할 수 있습니다).

JVM에서 Java 클래스의 로드 및 언로드 메커니즘 분석과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.