JAVA 소스 코드 컴파일은 세 가지 프로세스로 구성됩니다.
1. 소스 코드 컴파일 메커니즘.
2. 클래스 로딩 메커니즘
3. 클래스 실행 메커니즘
여기에서는 주로 컴파일과 클래스 로딩의 두 가지 메커니즘을 소개합니다.
1. 소스코드 컴파일
코드 컴파일은 JAVA 소스코드 컴파일러로 완성됩니다. 주요 목적은 소스 코드를 바이트코드 파일(클래스 파일)로 컴파일하는 것입니다. 바이트코드 파일 형식은 주로 상수 풀과 메소드 바이트코드의 두 부분으로 나뉩니다.
2. 클래스 로딩
클래스의 라이프 사이클은 가상 머신 메모리에 로드되는 것부터 시작하여 메모리에서 언로드되는 것까지 끝납니다. 이 과정은 7단계로 이루어지며, 그 중 초기화 전 부분은 클래스 로딩 부분
Loading----검증----준비----파싱------초기화-- -- 사용 -----제거
시스템이 처음 사용될 때 클래스를 로드할 수도 있고, 특정 Java 프로그램이 실행될 때 사전 로드 메커니즘을 사용하여 클래스를 로드할 수도 있습니다. Java 가상 머신 프로세스가 시작됩니다. 두 번 실행되는 Java 프로그램은 두 개의 서로 다른 JVM 프로세스에 있으며 두 JVM 간에 데이터가 공유되지 않습니다.
1. 로딩 단계
이 프로세스의 로딩은 클래스 로딩 메커니즘의 한 단계입니다. 이 단계에서 완료해야 할 사항은 다음과 같습니다. >
1) 클래스의 정규화된 이름을 통해 이 클래스를 정의하는 바이너리 바이트 스트림을 얻습니다. 2) 이 바이트 스트림이 나타내는 정적 저장 구조를 메서드 영역에서 런타임 데이터 구조로 변환합니다. 3) 메소드 영역의 데이터에 액세스하기 위한 입구로 Java 힙에서 이 클래스를 나타내는 클래스 객체를 생성합니다. 첫 번째 지점에서는 클래스의 바이너리 바이트 스트림을 어디서 어떻게 얻을 수 있는지 나타내지 않기 때문에 이 영역은 개발자가 플레이할 수 있는 여지가 많습니다. 이에 대해서는 나중에 클래스 로더에서 소개하겠습니다. 2. 준비 단계 이 단계에서는 클래스 변수(정적으로 수정된 변수)에 대한 메모리를 공식적으로 할당하고 클래스 변수의 초기 값을 설정합니다. 이 메모리 할당은 메서드 영역에서 발생합니다. 1. 인스턴스 변수에 대한 메모리 할당은 없습니다. 인스턴스 변수는 객체가 인스턴스화될 때 객체와 함께 JAVA 힙에 할당됩니다. 2. 여기에 설정된 초기값은 일반적으로 데이터 유형의 0 값을 나타냅니다. private static int a = 3; 이 클래스의 변수 a의 값은 준비 단계 후에 0입니다. 변수 a에 3이 할당되는 것은 초기화 단계에서 발생합니다.
new Test(); Class.forName(“com.mengdd.Test”);
Test.doSomething();
int b=Test.a; Test.a=b;
public class SupClass { public static int a = 123; static { System.out.println("supclass init"); } } public class SubClass extends SupClass { static { System.out.println("subclass init"); } } public class Test { public static void main(String[] args) { System.out.println(SubClass.a); } }
123
public class SupClass { public static int a = 123; static { System.out.println("supclass init"); } } public class Test { public static void main(String[] args) { SupClass[] spc = new SupClass[10]; } }
public class ConstClass { public static final String A= "MIGU"; static { System.out.println("ConstCLass init"); } } public class TestMain { public static void main(String[] args) { System.out.println(ConstClass.A); } }