Java 애플리케이션을 실행하려면 다음 단계가 필요합니다.
사용자가 Java 소스 코드 작성을 완료하면 Java 컴파일러 (javac 명령)가 .class 파일을 생성합니다. 그 후 .class 파일이 클래스 로더를 통해로드되고 응용 프로그램이 실행됩니다.
겉보기에 간단한 프로세스, 단계별로 정리해 보겠습니다.
.java 파일은 Java 컴파일러를 전달하여 바이트 코드 파일 인 .class 파일을 생성합니다. 이 단계에 대해 할 말이 없습니다. 이 부분을 컴파일이라고하며 cmd의 javac 명령으로 실현됩니다. 컴파일 결과는 콘텐츠를 C ++ 또는 어셈블리 언어와 같은 기계어로 변환하는 것이 아니라 jvm에서 인식 할 수있는 언어로 변환하는 것입니다. 이 특정 언어는 결국 Java 가상 머신에 의해 실행될 수 있습니다. 이것이 Java가 크로스 플랫폼이 될 수있는 이유이기도합니다. 크로스 플랫폼은 jvm을 통해 애플리케이션을 실행함으로써 실현됩니다.
컴파일 프로세스는 다음 단계로 나뉩니다.
1、词法分析:
找到关键字的token流。比如说if、else、while、for等关键词有对应的token流。比如:do对应DO,else对应ELSE等。
2、语法分析:
识别这些关键词是否符合要求。比如说while后面是否紧接着布尔类型的值等等。这一步会生成抽象树,具体可以学学编译原理。
3、语意分析:
将没有构造方法的类型添加无参构造函数;对变量进行初始化;变量的值是否匹配等等。
4、生成字节码
经过了语意分析后,形成的抽象树已经非常好了。然后将代码转换为JVM规范的字节码。JVM的架构模型是基于栈的,所有操作都是入栈和出栈进行操作的。
.class 파일이 생성 된 후 콘텐츠는 클래스 로더를 통해로드됩니다. 로딩 단계는 로딩, 링크 및 초기화입니다.
Load
클래스 이름을 실행하여 바이트 코드를 찾고 클래스를 생성합니다.
기본 로딩에는 3 개의 Bootstrap ClassLoader, Extension ClassLoader, System ClassLoader가 있습니다.
Bootstrap ClassLoader (루트 로더) : Java 코어 클래스 라이브러리로드를 담당합니다. 로더에 의해 어떤 라이브러리가로드되는지 보자
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (URL url : urls) {
System.out.println(url.toExternalForm());
}
file:/D:/Program%20Files%20(x86)/Java/jre/lib/resources.jar
file:/D:/Program%20Files%20(x86)/Java/jre/lib/rt.jar
file:/D:/Program%20Files%20(x86)/Java/jre/lib/sunrsasign.jar
file:/D:/Program%20Files%20(x86)/Java/jre/lib/jsse.jar
file:/D:/Program%20Files%20(x86)/Java/jre/lib/jce.jar
file:/D:/Program%20Files%20(x86)/Java/jre/lib/charsets.jar
file:/D:/Program%20Files%20(x86)/Java/jre/lib/jfr.jar
file:/D:/Program%20Files%20(x86)/Java/jre/classes
이 로더는 JVM 자체에서 구현됩니다.
Extension ClassLoader는 C ++ 로 구현됩니다 . jre / lib / ext 디렉토리에서 클래스 라이브러리를로드하는 데 사용됩니다.
System ClassLoader (시스템 로더) : 일반적으로 jar 패키지를로드하는 데 사용됩니다. 프로젝트 디렉토리 / bin 디렉토리에 저장된
모든 클래스는 위의 세 가지 로더를 통해로드 할 수 있습니다. 물론 클래스 로더를 사용자 정의 할 수도 있습니다. 모든 클래스가 한 번에로드되는 것은 아니지만 jvm은 어떤 클래스가 필요한지로드하도록 선택합니다.
링크
1. 클래스 파일이 문법적 요구 사항을 충족하는지 확인합니다 (예 : 최종 파일을 상속 할 수 없음, 코드 완료 여부 등). (개발자가 임의로 클래스 파일을 수정하는 것을 방지하기 위해 사용됩니다.)
2. 클래스 변수 (예 : 클래스 A에서 int a = 10)를 초기화 한 다음 a 변수에 0 값이 먼저 할당됩니다 ..
3. 다른 종속 클래스를 분석하고로드합니다. 예를 들어 A 클래스에 Person 클래스 개체가 있으면 Person 클래스 개체가로드됩니다.
초기화
클래스 변수에 정확한 값을 붙이면 위에서 언급했듯이 변수 a의 값은 0이고 이제 공식적으로 값 10이 할당됩니다.
마지막으로 JVM이 프로그램을 실행합니다.
보충 :로드 프로세스 중에 JVM 프로세스가 열리고 GC 복구 메커니즘도 열렸습니다. GC 복구 메커니즘은 백그라운드에서 메모리를 관리하고 할당하는 데 사용되는 데몬 스레드입니다. 데몬 스레드의 우선 순위가 더 낮습니다. 데몬이 아닌 스레드가 모두 실행되면 데몬 스레드 (GC 재활용 스레드 등)가 작동을 멈 춥니 다. 그래야만 JVM 프로세스가 닫힙니다.