JVM이로드 해야하는 것은 이진 스트림이며, .class 파일 또는 기타 양식의 형태 일 수 있습니다. 로딩 표준에 따라 디자인하면 큰 문제가 없습니다.
다음은 주로 메커니즘과 표준의 두 가지 문제를 분석합니다.
먼저 변수의 로딩 메커니즘과 유사한 Java 클래스 파일의 로딩 메커니즘을 사용해 봅시다. 먼저 클래스 파일을 메모리에로드 한 다음 데이터를 확인하고, 구문 분석하고 초기화하고, 마지막으로 가상 머신이 직접 사용할 수있는 Java 유형을 형성합니다. Java는 JIT 메커니즘을 채택하기 때문에로드가 느리게 진행되지만 장점은 분명하고 유연성이 높고 동적 하중 및 동적 연결을 지원합니다.
다음으로 수업의 로딩 과정에 대해 이야기 해 봅시다.
클래스 로딩의 기본 프로세스는 다음 순서로이지만 일부는이 순서로 엄격하지 않으며 일부는 무질서한 순서입니다. 예를 들어, 동적 하중에는 초기화와 구문 분석이 필요합니다.
1. 로딩
결정하는 것은 가상 머신에 달려 있지만 다음 단계가 실행되기 때문에 위의 단계가 실행되는 경우도 있습니다.
현재 가상 머신은 세 가지를 수행합니다.
먼저, 완전히 자격있는 이름을 통해 파일의 이진 스트림을 읽으십시오.
둘째, 파일에 정적 메소드와 변수를 메소드 영역에 넣습니다.
셋째, 객체를 생성하여 액세스 포털로 힙에 넣으십시오.
첫 번째는 바이너리 스트림을 읽는 것이며, 어떤 파일을 읽거나 읽는 위치를 말하지 않습니다. 따라서 Java에서 JAV, Zip 또는 네트워크 계층, 데이터베이스 계층 등이 될 수있는 Java에서 강력한 확장 성을 만듭니다.
주로 객체 및 방법 영역의 선언.
2. 확인
이진 흐름이 가상 머신의 요구 사항을 충족하고 검증기를 충족하지 않도록하십시오.
첫째, 매직 번호가 있는지 여부와 Java 파일의 요구 사항을 충족하는지 여부를 파일 형식 확인;
둘째, 메타 데이터 검증은 평범한 클래스의 간접 또는 직접 부모 클래스 객체를 가지고 있는지 여부 등의 초록 클래스가 직접 인스턴스화되는지와 같은 Java 코드 사양을 준수하는지 여부에 관계없이 메타 데이터 검증; 셋째, 바이트 코드 검증, 데이터 흐름 및 제어 흐름을 분석하며, 존재하지 않는 지침을 호출할지 여부, 하위 클래스에 부모 클래스를 할당할지 여부,이 유형의 객체에 객체를 할당 할 것인지 등을 해치는 동작이 없는지 확인합니다.
넷째, 기호 참조 검증, 주로 클래스, 변수 및 메소드에 대한 설명을 찾을 수 있는지 여부는 파일을 완전히 자격을 갖춘 이름으로 찾을 수 있는지, 액세스 가능한지 등을 찾을 수 있는지 등을 찾을 수 있는지 여부를 찾을 수 있습니다.
주로 내부 구조를 결정합니다
3. 준비하십시오
클래스 변수에 초기 값을 할당하는 것은 일반적으로 인스턴스 변수에 값을 할당하지 않고 정적 변수와 같은 0 값입니다.
4. 분석
일정한 풀에서 상징적 참조를 변환하는 과정을 직접 참조로 전환합니다. 여기에 언급 된 기호 참조는 변수 유형을 나타냅니다. 직접 참조는 객체에 직접 위치 할 수있는 핸들을 나타냅니다. 클래스, 메소드, 필드, 인터페이스 구문 분석, 완전히 자격있는 이름에 따라 관련 객체를 얻고 유형을 얻습니다. 클래스에 접근 할 수없는 경우, 불법 행위자가 던져지고, 필드 노스 히치 엘더러가 던져지지 않을 것입니다.
5. 초기화
프로그램 요구 사항에 따라 클래스 및 필요한 리소스를로드합니다. 4 가지 상황 만 있으므로 다음 작업을 수행하기 전에 적극적으로 초기화해야하므로 먼저 위의 4 단계를 수행해야합니다.
첫째, 새 또는 정적 키워드가있는 클래스, 새로운 객체를 생성하고 정적 정적 하중을 생성하면이 두 가지가 분명히 초기화 될 것입니다.
둘째, 클래스를 사용하는 경우 클래스에 대해 할 수있는 일은 없습니다.
셋째, 반사 클래스의 메소드는 초기화되어야합니다.
넷째, 기본 실행 클래스, 기본 메소드를 사용하는 클래스. 다른 수동 초기화 상황은 고려할 필요가 없습니다.
작은 예 :
공개 클래스 슈퍼 클래스 {static {system.out.println ( "superclass !!");} public static int value = 1;} 공개 클래스 서브 클래스는 superclass {static {system.out.println ( "subclass !!");} public static void main (string [] args). {system.out.println (subclass.value); 슈퍼 클래스 슈퍼 클래스 = new subclass ();}} 슈퍼 클래스 !! 1Subclass !!실행 결과는 문제를 보여줍니다. 서브 클래스가 부모 클래스 변수를 호출 할 때이 시점의 코드 관계가 서브 클래스와 관련이 없기 때문에 서브 클래스가 초기화되지 않습니다. 서브 클래스가 초기화되면 부모 클래스가 현재 메소드 본문에서 초기화되었으므로 부모 클래스가 다시 초기화되지 않습니다. 인터페이스와 상위 클래스의 유일한 차이점은 인터페이스 초기화에 상위 인터페이스가 필요하지 않으며 부모 인터페이스를 사용하는 경우에만 초기화되며 동일한 클래스 생성자가 생성된다는 것입니다.
현재 클래스 생성자가로드되고 클래스의 모든 변수가 초기화됩니다. 물론, 부모 수업은 아동 수업 전에 초기화됩니다.
6. 사용
로드 후, 호출 방법, 도면, 계산 등
7. 제거
수업은 더 이상 호출되지 않습니다
두 클래스가 동일한지 여부는 주로 동일한 로더를 사용한 첫 번째 로딩에 따라 다르며 두 번째로 정규화 된 이름 주소는 동일합니다.
위의 질문을하는 이유는 무엇입니까? 다음으로 가상 머신의 로딩 메커니즘에 대해 이야기하겠습니다.
Java Virtual Machines의 관점에서 두 개의 클래스 로더가 있으며, 하나는 시스템 로더 (Bootstrap Classloader)라고하며 다른 하나는 Custom Loader (Extends ClassLoader)라고합니다. 이것을 두 개로 나누어 진 1로, 하나는 응용 프로그램 로더라고하며 다른 하나는 확장 클래스 로더라고하며, 이는 일반적으로 전자에 기본값을받습니다. 그리고 우리의 응용 프로그램 로딩은 주로 위의 3 개의 로더에 의해 수행됩니다. 세 가지 간의 관계는 응용 프로그램> 확장> 부츠 랩입니다. 부모 대표 메커니즘은 두 쌍의 조합을 나타냅니다. 자식 로더는 먼저 부모 로더 메소드를 호출하며 하위 로더를 사용하기 전에 대상 객체를 찾을 수 없습니다.
의사 코드는 다음과 같습니다.
loadClass (문자열 이름, 부울 resolve) {class c = findloadedClass () if (c == null) {if (parent! = null) c = parent.loadClass (name, false); c = findBootStrapClassorNull (name);} catch (c == null) c = findsclass (null);Java는 우리가 FindClass에 전화 클래스의 논리를 작성한다고 옹호합니다. 이는 Parent Delegation 메커니즘을 정상적으로 사용하는 데 도움이 될 것입니다.
파괴 1.로드 클래스를 다시 작성하십시오
DAVER 2. 스레드 컨텍스트 로더를 사용하여 상위 로더가 Child 로더 방법을 호출하도록합니다.
파괴 3. 핫로드에 일반적으로 사용되는 방법은 클래스 로더를 사용자 정의하고 원래 버그 모듈 -OSGI를 덮어 쓰는 것입니다.
그러나 사용자 정의 로더 간의 규칙이 혼란스럽고 동시에 서로를 참조하는 데 문제가있는 경우 클래스는 발견되지 않으며 스레드 교착 및 메모리 누출이 발생합니다.
플러그인이라고도하는 핫 수리와 관련하여 가장 인기있는 것은 핫픽스, 누와, 드로이드 픽스 및 픽스 등입니다.이 프레임 워크는 Github 또는 다른 곳에서 찾을 수 있습니다. 원칙은 위와 같이, 방법은 다양하고, 커버리지, 리디렉션 등, 구성, 조치 설정 등; 플러그인으로서 다음 조건을 충족해야합니다.
1. 독립적으로 설치할 수 있지만 독립적으로 실행할 수 없습니다.
2. 후진 호환성을 확장 할 수 있습니다
3. 호스트 프로그램에서만 실행할 수 있으며 비활성화되거나 교체 될 수 있습니다.
Java Advanced Virtual Machine 로딩 메커니즘에 대한 위의 예제는 내가 공유하는 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.