Javaアーキテクチャとコンポーネントの説明[2022]
公開: 2021-01-04Javaプログラマーになる前に、この言語のあらゆる側面を理解する必要があります。 Javaの最も重要な側面の1つは、Javaアーキテクチャーです。 この点に関するもう1つの技術的なトピックは、JVMのコンポーネントを知ることです。 したがって、この記事では、これらの重要なトピックの両方について説明します。
この記事は、Javaの基本を一般的に理解していることを前提としています。 Javaの基礎に精通していない場合でも、以下のコメントセクションで質問をすることができます。 始めましょう:
目次
Javaアーキテクチャの説明
Javaには、コンパイルと解釈の2つのプロセスがあります。 Javaコンパイラは、Javaに存在するコードをバイトコードに変換します。 Java仮想マシン(JVM)は、バイトコードをマシンが直接実行するマシンコードに変換します。
このプロセスは、次の手順で説明できます。
- ソースコードはJavaコンパイラに送られます
- Javaコンパイラはそれをバイトコードに変換します
- バイトコードはJava仮想マシンに送られます
- 最後に、OS(オペレーティングシステム)に行きます
Javaアーキテクチャがどのように機能するかについて少し理解したので、さまざまなコンポーネントを見てみましょう。
JVM(Java仮想マシン)
Javaの作成者は、JavaをWORA(Write Once Run Anywhere)にしたいと考えていました。 つまり、どのプラットフォームでもアプリケーションを実行できますが、Javaにこの品質を与えるのはJVMです。 JVMは、Javaコードを実行するための環境を提供します。 バイトコードを解釈し、それをマシンコードに変換して、マシンがJavaプログラムを実行できるようにします。

JVMロードは、コードを検証して実行します。 また、コードにランタイム環境を提供して、マシンで実行できるようにします。
JRE(Javaランタイム環境)
JREは、Javaプログラムを実行できるランタイム環境を構築します。 これはJavaコードを取り、それを必要なライブラリと組み合わせます。 JREは、実行のためにJVMも開始します。 Javaランタイム環境には、プログラムを実行できるように必要なソフトウェアとライブラリがあります。
JDK(Java Development Kit)
JDKを使用してJavaアプリとプログラムを開発します。 これはソフトウェア開発環境であり、JRE、コンパイラ、インタプリタ、ドキュメントジェネレータ、アーカイバなどの複数の開発ツールが含まれています。
JVMのコンポーネント
Javaアーキテクチャに慣れてきたので、JVMのコンポーネントを見て、理解を深めましょう。 JVMはJavaにとって最も重要なタスクの1つを実行するため、その目的のために多くの部分があります。 各要素について詳しく説明します。
ClassLoaderサブシステム
ClassLoaderは、クラスファイルをロードするJava仮想マシンのサブシステムです。 これは、プログラムをロードして他のタスクを実行できるようにするためのアーキテクチャの最初のコンポーネントです。 また、クラスファイルをリンクして初期化します。 その作業は、次の3つのセクションに分けることができます。
読み込み中
このコンポーネントはクラスをロードします。 ブートストラップクラスパスに属するクラスをロードするためのBootStrapClassLoaderがあります。 Extension ClassLoaderは、extフォルダー内にあるクラスをロードし、Application ClassLoaderは、前述の環境変数および同様のファイルのパスをロードします。

リンク
ここで、サブシステムには、バイトコードが正しいかどうかを検証するためのベリファイアがあります。 バイトコードが適切でない場合、検証エラーが生成されます。 リンクセクションは、すべての静的変数メモリを割り当て、デフォルト値を割り当てます。 また、メモリのシンボリック参照を元の参照に置き換えます。
初期化
ClassLoadingのこのセクションでは、システムは静的変数を元の値に割り当て、静的ブロックを実行します。
ランタイムデータエリア
JVMのこのセクションには、次のコンポーネントがあります。
メソッドエリア
メソッド領域には、すべてのクラスレベルのデータが格納されます。 すべてのJVMにはメソッド領域が1つだけあります。
ヒープ領域
ヒープ領域には、すべてのオブジェクトとそのインスタンス配列および変数が格納されます。 メソッド領域と同様に、JVMにはヒープ領域が1つだけあります。
スタックエリア
このセクションでは、脅威ごとに一意のランタイムスタックを作成し、スタックメモリ(スタックフレームとも呼ばれます)内のすべてのメソッド呼び出しのエントリを作成します。 メソッドに関連するローカル変数配列、中間操作のワークスペースとして機能するオペランドスタック、およびメソッドに関連するすべてのシンボルが格納されたままのフレームデータがあります。 フレームデータは、例外がない限り、キャッチブロック情報を保持します。
PCレジスタ
すべてのスレッドには、実行中の命令のアドレスを保持する個別のPCレジスタがあります。 命令の実行が完了すると、PCレジスタは次の命令で自身を更新します。
ネイティブメソッドスタック
名前が示すように、このセクションにはネイティブメソッドに関する情報が含まれています。 脅威ごとに固有のネイティブメソッドスタックを作成します。
ランタイムデータエリアの最初の2つのコンポーネント(メソッドエリアとヒープエリア)は共有リソースですが、スタックエリアは共有リソースではないことに注意してください。
実行エンジン
実行エンジンはバイトコードを実行します。 少しずつ読み取って実行します。 また、さまざまなコンポーネントがあります。
通訳者
このコンポーネントはバイトコードをすばやく解釈しますが、実行には少し時間がかかります。 システムが1つのメソッドを複数回呼び出す場合など、重大な欠点があり、毎回新しい解釈が必要になります。 通訳者のこの欠点は、プロセスの効率を大幅に損ないます。
JITコンパイラ
JITコンパイラには、インタプリタのような欠点はありません。 そのため、Execution Engineは繰り返しコードを検出すると、インタープリターの代わりにJITコンパイラーを使用します。 JITコンパイラは、バイトコードをコンパイルした後、ネイティブコードに変換します。 システムはネイティブコードを直接使用します。
JITコンパイラには、中間コードを生成するための中間コードジェネレータと、それを最適化するためのコードオプティマイザがあります。 また、ネイティブdoeを生成するターゲットコードジェネレーターと、ホットスポットを見つけるプロファイルもあります。
ガベージコレクター
実行エンジンの最後のコンポーネントは、参照されていないオブジェクトを収集して削除するガベージコレクターです。 system.gc()を呼び出すことでトリガーできますが、実行が保証されるわけではありません。

これらのコンポーネントとは別に、JVMにはJNI(Java Native Interface)とネイティブメソッドライブラリもあります。 前者は後者と相互作用し、実行に必要なネイティブライブラリを提供します。
世界のトップ大学からソフトウェア開発コースを取得します。 エグゼクティブPGプログラム、高度な証明書プログラム、または修士プログラムを取得して、キャリアを早急に進めましょう。
最終的な考え
この記事は簡潔で役立つものにするよう努めており、この情報が参考になると確信しています。 JVMのコンポーネントまたはJavaアーキテクチャについて質問がある場合は、コメントを通じてお問い合わせください。
Javaとそのアプリケーションについて詳しくは、ブログをご覧ください。 この堅牢なプログラミング言語のさまざまな側面をカバーする、役立つガイドや記事が多数あります。
Java、OOP、フルスタックソフトウェア開発の詳細に興味がある場合は、upGrad&IIIT-Bのフルスタックソフトウェア開発のエグゼクティブPGプログラムをチェックしてください。これは、働く専門家向けに設計されており、500時間以上の厳格なトレーニングを提供します。 9以上のプロジェクトと割り当て、IIIT-B卒業生のステータス、実践的な実践的なキャップストーンプロジェクト、トップ企業との仕事の支援。
