Javaはどのようにアプリケーションを実行しますか

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ファイルが生成された後、コンテンツはクラスローダーを介してロードされます。ロードの手順は、ロード、リンク、および初期化です。
ロード
クラス名を実行してバイトコードを見つけ、クラスを生成します。
デフォルトのロードには、3つのブートストラップクラスローダー、拡張クラスローダー、システムクラスローダーがあります。
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自体によって実装されます。
拡張ClassLoaderはC ++によって実装されます。これは、jre / lib / extディレクトリにクラスライブラリをロードするために使用されます。
System ClassLoader(システムローダー):通常、jarパッケージをロードするために使用されます。プロジェクトディレクトリ/ binディレクトリに保存され、
すべてのクラスは上記の3つのローダーを介してロードできます。もちろん、クラスローダーをカスタマイズすることもできます。すべてのクラスが一度にロードされるわけではありませんが、jvmはどのクラスが必要なときにロードするかを選択することに注意してください。

リンク
1.クラスファイルが文法要件を満たしているかどうかを確認します。たとえば、finalを継承できない、コードが完全であるかどうかなどです。(開発者がクラスファイルを任意に変更できないようにするために使用されます)。
2.クラス変数を初期化します(たとえば、クラスAでint a = 10)。次に、変数に最初に値0が割り当てられ
ます。3 他の依存クラスを分析してロードします。たとえば、クラスAにPersonクラスオブジェクトがある場合、Personクラスオブジェクトがロードされます。

初期化
正しい値をクラス変数に付加します。前述のように、変数の値は0であり、正式に値10が割り当てられています。

最後に、JVMがプログラムを実行します。

補足:ロードプロセス中に、JVMプロセスが開かれ、GC回復メカニズムも開かれました。GC回復メカニズムはデーモンスレッドであり、バックグラウンドでメモリを管理および割り当てるために使用されます。デーモンスレッドの優先度は低くなります。デーモン以外のスレッドがすべて実行されると、デーモンスレッド(GCリサイクルスレッドなど)は機能しなくなります。そうして初めて、JVMプロセスが閉じられます。

おすすめ

転載: blog.csdn.net/new_Aiden/article/details/51824933