>  기사  >  Java  >  jvm 클래스 로딩 프로세스는 무엇입니까?

jvm 클래스 로딩 프로세스는 무엇입니까?

不言
不言원래의
2019-04-10 10:35:482263검색

jvm 클래스 로딩 프로세스는 무엇입니까?

jvm 클래스 로딩 과정은 로딩, 연결, 초기화의 세 단계로 나누어집니다.

jvm 클래스 로딩 프로세스는 무엇입니까?

Loading

이 클래스를 외부에서 jvm으로 로드합니다. 동시에 클래스의 설명 정보가 메소드 영역에 생성되고 클래스의 Claas 유형이 메모리에 생성됩니다. 메소드 영역에서 이 클래스의 데이터 액세스 항목으로.

Connection

이는 매우 중요한 단계이며 검증, 준비, 분석의 세 단계로 나누어집니다. ​​

검증: 클래스 로딩의 정확성을 확인하세요. 일반적으로 javac로 컴파일한 클래스 파일은 문제가 없지만 일부 사람들의 클래스 파일은 JVM 컴파일 규칙을 따르지 않는 다른 방법을 통해 스스로 컴파일될 수 있습니다. 이 단계는 이 부분을 필터링하는 것입니다.

준비: 클래스의 정적 변수에 메모리를 할당하고 기본값으로 초기화합니다. 우리는 정적 변수가 우리 없이도 수동으로 값을 할당할 수 있다는 것을 알고 있습니다. 예를 들어 int 유형의 초기 값은 false이고 초기 값은 false입니다. 참조 유형의 값이 null입니다. 여기서는 정적 변수에 메모리만 할당되며 현재 개체 인스턴스는 없습니다.

분석: 클래스의 기호 참조를 직접 참조로 변환합니다. 기호 참조와 직접 참조에 대해 설명하세요. 예를 들어, 메소드 A에서 메소드 B를 사용할 때 A(){B();}, B()는 기호 참조입니다. 우리가 처음 Java를 배울 때 우리 모두는 이것이 Java에 대한 참조라는 것을 알고 B라고 생각했습니다. 그러나 이것은 불완전합니다. 여기서 B는 단지 상징적인 참조일 뿐이며, 프로그래머가 메소드를 호출하는 데에는 큰 의미가 없습니다. 이 메소드가 이 호출과 유사할 수 있다는 것을 알고 있지만 메소드 B가 실제로 호출되면 포인터를 통해 메소드 B의 메모리 주소를 가리킵니다. 이 포인터는 실제로 메소드 호출을 담당하며 직접 참조입니다.

Initialization

초기화 단계에서는 클래스의 초기화 메서드 clinit()가 호출되어 정적 값에 실제 값을 할당합니다. 변수(예: 값을 123에 할당), 정적 코드 블록을 실행합니다. JVM 사양에는 로딩 시점에 대한 필수 제약이 없습니다. 그러나 초기화를 위해 JVM 사양에서는 클래스가 즉시 초기화되어야 하는 상황은 5가지로만 엄격하게 규정하고 있습니다.

설명해 보겠습니다. clinit() 메소드는 무엇인가요? 어떻게 생성되나요? clinit() 메소드는 클래스의 정적 변수 및 정적 명령문을 자동으로 수집하는 컴파일러에 의해 생성됩니다. 컴파일러가 수집하는 순서는 명령문이 나타나는 순서에 따라 결정됩니다. 정적 명령문 블록은 아래 그림과 같이 뒤에 정의된 변수만 복사할 수 있지만 사용할 수는 없으며 가상 머신 사양에서는 clinit이 이를 보장합니다. () 부모 클래스의 메서드는 하위 클래스보다 먼저 실행되어야 하지만 상속을 통해서는 실행되지 않습니다.

위 내용은 jvm 클래스 로딩 프로세스는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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