1. 概要

この記事では、JVM、JRE、およびJDKのコンポーネントと使用法を検討することにより、それらの違いについて説明します。

2. JVM

Java仮想マシン(JVM)は、Javaプログラムを実行する仮想マシンの実装です。

JVMは最初にバイトコードを解釈します。 次に、クラス情報をメモリ領域に格納します。 最後に、Javaコンパイラによって生成されたバイトコードを実行します。

これは、独自の命令セットを備えた抽象的なコンピューティングマシンであり、実行時にさまざまなメモリ領域を操作します。

JVMのコンポーネントは次のとおりです。

  • クラスローダー
  • 実行時データ領域
  • 実行エンジン

2.1. クラスローダー

JVMの初期タスクには、バイトコードのロード、検証、およびリンクが含まれます。 クラスローダーはこれらのタスクを処理します。

特にクラスローダーに関する詳細な記事があります。

2.2. 実行時データ領域

JVMは、Javaプログラムを実行するためのさまざまなメモリ領域を定義します。これらは実行時に使用され、実行時データ領域と呼ばれます。 これらの領域の一部は、JVMの起動時に作成され、JVMの終了時に破棄されますが、一部の領域は、スレッドの作成時に作成され、スレッドの終了時に破棄されます。

これらの領域を1つずつ考えてみましょう。

メソッドエリア

基本的に、メソッド領域はコンパイルされたコードのストレージ領域に類似しています。 実行時定数プール、フィールドおよびメソッドデータ、メソッドとコンストラクターのコード、および完全修飾クラス名などの構造を格納します。 JVMは、クラスごとにこれらの構造を格納します。

永続生成スペース(PermGen)とも呼ばれるメソッド領域は、JVMの起動時に作成されます。 この領域のメモリは連続している必要はありません。 すべてのJVMスレッドはこのメモリ領域を共有します。

ヒープ領域

JVMは、この領域のすべてのクラスインスタンスと配列にメモリを割り当てます。

ガベージコレクター(GC)は、オブジェクトのヒープメモリを再利用します。 基本的に、GCには、オブジェクトからメモリを再利用するための3つのフェーズがあります。 2つのマイナーGCと1つのメジャーGC。

ヒープメモリには3つの部分があります。

  • エデンスペース–それは若い世代のスペースの一部です。 オブジェクトを作成すると、JVMはこのスペースからメモリを割り当てます
  • サバイバースペース–それは若い世代のスペースの一部でもあります。 サバイバースペースには、GCのマイナーGCフェーズを生き残った既存のオブジェクトが含まれています
  • Tenured Space –これはOldGenerationスペースとしても知られています。 それは長く存続するオブジェクトを保持します。 基本的に、若い世代のオブジェクトにはしきい値が設定され、このしきい値に達すると、これらのオブジェクトは保有スペースに移動されます。

JVMは、起動するとすぐにヒープ領域を作成します。 JVMのすべてのスレッドがこの領域を共有します。 ヒープ領域のメモリは連続している必要はありません。

スタックエリア

データをフレームとして格納し、各フレームはローカル変数、部分的な結果、およびネストされたメソッド呼び出しを格納します。 JVMは、新しいスレッドを作成するたびにスタック領域を作成します。 この領域は、スレッドごとにプライベートです。

スタック内の各エントリは、スタックフレームまたはアクティベーションレコードと呼ばれます。 各フレームには3つの部分が含まれています。

  • ローカル変数配列–メソッドのすべてのローカル変数とパラメーターが含まれます
  • オペランドスタック–中間計算の結果を格納するためのワークスペースとして使用されます
  • フレームデータ–部分的な結果、メソッドの戻り値、および例外の場合に対応するキャッチブロック情報を提供するExceptionテーブルへの参照を格納するために使用されます

JVMスタックのメモリは連続している必要はありません。

PCレジスタ

各JVMスレッドには、現在実行中の命令のアドレスを格納する個別のPCレジスタがあります。 現在実行中の命令がネイティブメソッドの一部である場合、この値は未定義です。

ネイティブメソッドスタック

ネイティブメソッドは、Java以外の言語で記述されたメソッドです。

JVMは、これらのネイティブメソッドを呼び出す機能を提供します。 ネイティブメソッドスタックは、「Cスタック」とも呼ばれます。 ネイティブメソッド情報を保存します。 ネイティブメソッドがマシンコードにコンパイルされるときはいつでも、通常、ネイティブメソッドスタックを使用して状態を追跡します。

JVMは、新しいスレッドを作成するたびにこれらのスタックを作成します。 したがって、JVMスレッドはこの領域を共有しません。

2.3. 実行エンジン

実行エンジンは、メモリ領域に存在する情報を使用して命令を実行します。 これには3つの部分があります。

通訳者

クラスローダーがバイトコードをロードして検証すると、インタープリターはバイトコードを1行ずつ実行します。 この実行は非常に遅いです。 インタプリタの欠点は、1つのメソッドが複数回呼び出されると、新しい解釈が必要になるたびに発生することです。

ただし、JVMはJITコンパイラを使用してこの欠点を軽減します。

ジャストインタイム(JIT)コンパイラ

JITコンパイラは、実行時に頻繁に呼び出されるメソッドのバイトコードをネイティブコードにコンパイルします。 したがって、Javaプログラムの最適化を担当します。

JVMは、実行されているメソッドを自動的に監視します。 メソッドがJITコンパイルの対象になると、マシンコードへのコンパイルがスケジュールされます。 この方法は、ホットメソッドと呼ばれます。 このマシンコードへのコンパイルは、別のJVMスレッドで行われます。

その結果、現在のプログラムの実行を中断することはありません。 マシンコードにコンパイルした後、それはより速く実行されます。

ガベージコレクター

Javaは、ガベージコレクションを使用してメモリ管理を処理します。 これは、ヒープメモリを調べ、使用されているオブジェクトと使用されていないオブジェクトを識別し、最後に未使用のオブジェクトを削除するプロセスです。

GCはデーモンスレッドです。 System。gc()メソッドを使用して明示的に呼び出すことができますが、すぐには実行されず、JVMがGCを呼び出すタイミングを決定します。

2.4. Java Native Interface

これは、Javaコードとネイティブ(C / C ++)ライブラリ間のインターフェイスとして機能します。

プラットフォームに依存する機能を実装するなど、Javaだけではアプリケーションのニーズを満たさない場合があります。

このような場合、JNIを使用して、JVMで実行されているコードを呼び出すことができます。 逆に、ネイティブメソッドがJVMで実行されているコードを呼び出すことができます。

2.5. ネイティブライブラリ

これらはプラットフォーム固有のライブラリであり、ネイティブメソッドの実装が含まれています。

3. JRE

Javaランタイム環境(JRE)は、Javaアプリケーションの実行に使用されるソフトウェアコンポーネントのバンドルです。

JREのコアコンポーネントは次のとおりです。

  • Java仮想マシン(JVM)の実装
  • Javaプログラムを実行するために必要なクラス
  • プロパティファイル

上記のセクションでJVMについて説明しました。 ここでは、コアクラスとサポートファイルに焦点を当てます。

3.1. ブートストラップクラス

jre / lib/の下にブートストラップクラスがあります。 このパスはブートストラップクラスパスとも呼ばれます。次のものが含まれます。

  • rt.jarのランタイムクラス
  • i18n.jarの国際化クラス
  • charsets.jarの文字変換クラス
  • その他

Bootstrap ClassLoaderは、JVMの起動時にこれらのクラスをロードします。

3.2. 拡張クラス

拡張クラスは、Javaプラットフォームへの拡張のディレクトリとして機能する jre / lib / extn/にあります。 このパスは拡張クラスパスとも呼ばれます。

これには、 jfxrt.jar のJavaFXランタイムライブラリと、localedata.jarjava.textおよびjava.utilパッケージのロケールデータが含まれています。 ユーザーは、このディレクトリにカスタムjarを追加することもできます。

3.3. プロパティ設定

Javaプラットフォームは、これらのプロパティ設定を使用して構成を維持します。 使用法に応じて、 / jre / lib/内のさまざまなフォルダーに配置されます。 これらには以下が含まれます:

  • calendar.propertiesのカレンダー構成
  • logging.propertiesでの構成のログ記録
  • net.propertiesのネットワーク構成
  • / jre / lib / deploy/のデプロイメントプロパティ
  • / jre / lib / management/の管理プロパティ

3.4. その他のファイル

上記のファイルとクラスとは別に、JREには他の事項のファイルも含まれています。

  • jre / lib /securityでのセキュリティ管理
  • jre / lib /appletにあるアプレットのサポートクラスを配置するためのディレクトリ
  • jre / lib /fontsなどのフォント関連ファイル

4. JDK

Java Development Kit(JDK)は、Javaプログラムを開発、コンパイル、デバッグ、および実行するための環境とツールを提供します。

JDKのコアコンポーネントは次のとおりです。

  • JRE
  • 開発ツール

上記のセクションでJREについて説明しました。

ここでは、さまざまな開発ツールに焦点を当てます。 これらのツールを使用法に基づいて分類してみましょう。

4.1. 基本的なツール

これらのツールはJDKの基盤を築き、Javaアプリケーションの作成と構築に使用されます。 これらのツールの中には、コンパイル、デバッグ、アーカイブ、Javadocの生成などのユーティリティがあります。

それらが含まれます:

  • javac – クラスとインターフェイスの定義を読み取り、それらをクラスファイルにコンパイルします
  • java –はJavaアプリケーションを起動します
  • javadoc – は、JavaソースファイルからAPIドキュメントのHTMLページを生成します
  • apt – は、指定されたソースファイルのセットに存在する注釈に基づいて注釈プロセッサを検索して実行します
  • appletviewer –WebブラウザーなしでJavaアプレットを実行できるようにします
  • jar – は、Javaアプレットまたはアプリケーションを単一のアーカイブにパッケージ化します
  • jdb –Javaアプリケーションのバグを見つけて修正するために使用されるコマンドラインデバッグツール
  • javah – は、JavaクラスからCヘッダーおよびソースファイルを生成します
  • javap – はクラスファイルを分解し、クラスファイルに存在するフィールド、コンストラクター、およびメソッドに関する情報を表示します
  • extcheck – は、ターゲットJavaアーカイブ(JAR)ファイルと現在インストールされている拡張JARファイル間のバージョンの競合を検出します

4.2. セキュリティツール

これらには、Javaキーストアを操作するために使用されるキーおよび証明書管理ツールが含まれます。

Javaキーストアは、認証証明書または公開鍵証明書のコンテナです。 その結果、Javaベースのアプリケーションで、暗号化、認証、およびHTTPSを介したサービスのためによく使用されます。

また、システムにセキュリティポリシーを設定し、本番環境でこれらのポリシーの範囲内で機能するアプリケーションを作成するのに役立ちます。 これらには以下が含まれます:

  • keytool – は、キーストアエントリ、つまり暗号化キーと証明書の管理に役立ちます
  • jarsigner – は、キーストア情報を使用してデジタル署名されたJARファイルを生成します
  • policytool – を使用すると、インストールのセキュリティポリシーを定義する外部ポリシー構成ファイルを管理できます。

一部のセキュリティツールは、Kerberosチケットの管理にも役立ちます。

Kerberosはネットワーク認証プロトコルです。

チケットに基づいて機能し、安全でないネットワークを介して通信するノードが、安全な方法で相互にIDを証明できるようにします。

  • kinit –Kerberosチケット許可チケットの取得とキャッシュに使用
  • ktab – は、キーテーブルのプリンシパル名とキーペアを管理します
  • klist – は、ローカルクレデンシャルキャッシュとキーテーブルのエントリを表示します

4.3. 国際化ツール

国際化とは、エンジニアリングを変更せずにさまざまな言語や地域に適応できるようにアプリケーションを設計するプロセスです。

この目的のために、JDKは native2ascii。 このツールは、JREでサポートされている文字を含むファイルを、ASCIIまたはUnicodeエスケープでエンコードされたファイルに変換します。

4.4. リモートメソッド呼び出し(RMI)ツール

RMIツールは、Javaアプリケーション間のリモート通信を可能にするため、分散アプリケーションの開発範囲を提供します。

RMIを使用すると、あるJVMで実行されているオブジェクトが、別のJVMで実行されているオブジェクトのメソッドを呼び出すことができます。 これらのツールは次のとおりです。

  • rmic – は、Java Remote Method Protocol(JRMP)またはInternet Inter-Orb Protocol(IIOP)を使用して、リモートオブジェクトのスタブ、スケルトン、およびタイクラスを生成します。
  • rmiregistry –はリモートオブジェクトレジストリを作成して開始します
  • rmid –sアクティベーションシステムデーモンを起動します。 これにより、オブジェクトをJava仮想マシンに登録してアクティブ化できます
  • serialver –は指定されたクラスのシリアルバージョンUIDを返します

4.5. JavaIDLおよびRMI-IIOPツール

Javaインターフェイス定義言語(IDL)は、JavaプラットフォームにCommon Object-Based Request Broker Architecture(CORBA)機能を追加します。

これらのツールを使用すると、分散Java Webアプリケーションは、業界標準のObject Management Group(OMG)–IDLを使用してリモートネットワークサービスの操作を呼び出すことができます。

同様に、インターネットInterORBプロトコル(IIOP)を使用できます。

RMI-IIOP、すなわち RMI over IIOPを使用すると、RMIAPIを介してCORBAサーバーとアプリケーションのプログラミングが可能になります。 したがって、インターネットInterORBプロトコル(IIOP)を介して、CORBA準拠の言語で記述された2つのアプリケーション間の接続が可能になります。

これらのツールは次のとおりです。

  • tnameserv –オブジェクト参照用のツリー構造のディレクトリを提供する一時的なネーミングサービス
  • idlj –指定されたIDLファイルのJavaバインディングを生成するためのIDLからJavaへのコンパイラ
  • orbd –クライアントがCORBA環境のサーバー上で永続オブジェクトを透過的に検索して呼び出すことができるようにします
  • servertool – は、永続サーバーをORBデーモン( orbd )に登録または登録解除したり、ORBデーモンに登録された永続サーバーを起動およびシャットダウンしたりするためのコマンドラインインターフェイスを提供します。

4.6. Javaデプロイメントツール

これらのツールは、JavaアプリケーションとアプレットをWebにデプロイするのに役立ちます。次のものが含まれます。

  • pack200 – Java gzip コンプレッサーを使用して、JARファイルをpack200ファイルに変換します
  • unpack200 –pack200ファイルをJARファイルに変換します

4.7. Javaプラグインツール

JDKは私たちに htmlconverter。 さらに、Javaプラグインと組み合わせて使用します。

一方では、Javaプラグインは、一般的なブラウザとJavaプラットフォーム間の接続を確立します。 この接続の結果として、Webサイト上のアプレットはブラウザ内で実行できます。

一方、 htmlconverter は、アプレットを含むHTMLページをJavaプラグインの形式に変換するためのユーティリティです。

4.8. JavaWebスタートツール

JDKがもたらす javaws。 JavaWebStartと組み合わせて使用できます。

このツールを使用すると、ブラウザからシングルクリックでJavaアプリケーションをダウンロードして起動できます。したがって、インストールプロセスを実行する必要はありません。

4.9. 監視および管理ツール

これらは、JVMのパフォーマンスとリソース消費を監視するために使用できる優れたツールです。これらのいくつかを次に示します。

  • jconsole – は、Javaアプリケーションを監視および管理できるグラフィカルコンソールを提供します
  • jps –はターゲットシステム上のインストルメントされたJVMを一覧表示します
  • jstat –JVM統計を監視します
  • jstatd –インストルメント化されたJVMの作成と終了を監視します

4.10. トラブルシューティングツール

これらは、タスクのトラブルシューティングに活用できる実験的なツールです

  • info – は、指定されたJavaプロセスの構成情報を生成します
  • jmap –指定されたプロセスの共有オブジェクトメモリマップまたはヒープメモリの詳細を出力します
  • jsadebugd – Javaプロセスに接続し、デバッグサーバーとして機能します
  • jstack –特定のJavaプロセスのJavaスレッドのJavaスタックトレースを出力します

5. 結論

この記事では、JVM、JRE、およびJDKの基本的な違いはそれらの使用法にあることを確認しました。

最初に、JVMが実際にJavaバイトコードを実行する抽象コンピューティングマシンである方法について説明しました。

次に、Javaアプリケーションを実行する方法を説明しました。JREを使用します。

そして最後に、Javaアプリケーションの開発方法を理解し、JDKを使用します。

また、このコンポーネントのツールと基本的な概念を掘り下げるのにも少し時間がかかりました。