JVM、JRE、およびJDKの違い
1. 概要
この記事では、JVM、JRE、およびJDKのコンポーネントと使用法を考慮して、それらの違いについて説明します。
2. JVM
Java仮想マシン(JVM)は、Javaプログラムを実行する仮想マシンの実装です。
JVMは最初にバイトコードを解釈します。 その後、クラス情報をメモリ領域に保存します。 最後に、javaコンパイラによって生成されたバイトコードを実行します。
独自の命令セットを備えた抽象コンピューティングマシンであり、実行時にさまざまなメモリ領域を操作します。
JVMのコンポーネントは次のとおりです。
-
クラスローダー
-
実行時データ領域
-
実行エンジン
2.1. クラスローダー
JVMの初期タスクには、バイトコードのロード、検証、リンクが含まれます。 クラスローダーはこれらのタスクを処理します。
特にclass loadersに関する詳細な記事があります。
2.2. 実行時データ領域
The JVM defines various memory areas to execute a Java program.これらは実行時に使用され、実行時データ領域と呼ばれます。 これらの領域の一部は、JVMの起動時に作成され、JVMの終了時に破棄されます。一方、スレッドの作成時に作成され、スレッドの終了時に破棄されます。
これらの領域を1つずつ考えてみましょう。
メソッドエリア
基本的に、メソッド領域はコンパイルされたコードのストレージ領域に似ています。 実行時定数プール、フィールドおよびメソッドデータ、メソッドおよびコンストラクターのコード、完全修飾クラス名などの構造を格納します。 JVMは、クラスごとにこれらの構造を保存します。
メソッド領域は、永続生成スペース(PermGen)とも呼ばれ、JVMの起動時に作成されます。 この領域のメモリは連続している必要はありません。 すべてのJVMスレッドはこのメモリ領域を共有します。
ヒープ領域
JVMは、この領域のすべてのクラスインスタンスと配列にメモリを割り当てます。
ガベージコレクター(GC)は、オブジェクトのヒープメモリを再利用します。 基本的に、GCにはオブジェクトからメモリを回収する3つのフェーズがあります。 2つのマイナーGCと1つのメジャーGC。
ヒープメモリには3つの部分があります。
-
エデンスペース–それは若い世代のスペースの一部です。 オブジェクトを作成すると、JVMはこのスペースからメモリを割り当てます
-
サバイバースペース–ヤングジェネレーションスペースの一部でもあります。 生存空間には、GCのマイナーGCフェーズを生き残った既存のオブジェクトが含まれます
-
Tenured Space –これは、Old Generationスペースとしても知られています。 長く生き残ったオブジェクトを保持します。 基本的に、若い世代のオブジェクトにしきい値が設定され、このしきい値に達すると、これらのオブジェクトは終身スペースに移動されます。
JVMは、起動するとすぐにヒープ領域を作成します。 JVMのすべてのスレッドはこの領域を共有します。 ヒープ領域のメモリは連続している必要はありません。
スタックエリア
データをフレームとして保存し、各フレームにローカル変数、部分的な結果、ネストされたメソッド呼び出しを保存します。 JVMは、新しいスレッドを作成するたびにスタック領域を作成します。 この領域は各スレッド専用です。
スタック内の各エントリは、スタックフレームまたはアクティベーションレコードと呼ばれます。 各フレームには3つの部分が含まれます。
-
ローカル変数配列-メソッドのすべてのローカル変数とパラメーターが含まれます
-
オペランドスタック–中間計算の結果を格納するためのワークスペースとして使用されます
-
フレームデータ–部分的な結果、メソッドの戻り値、および例外の場合に対応するキャッチブロック情報を提供するExceptionテーブルへの参照を格納するために使用されます
JVMスタックのメモリは連続している必要はありません。
PCレジスタ
各JVMスレッドには、現在実行中の命令のアドレスを格納する個別のPCレジスタがあります。 現在実行中の命令がネイティブメソッドの一部である場合、この値は未定義です。
ネイティブメソッドスタック
ネイティブメソッドは、Java以外の言語で記述されたものです。
JVMは、これらのネイティブメソッドを呼び出す機能を提供します。 ネイティブメソッドスタックは、「Cスタック」とも呼ばれます。 ネイティブメソッド情報を保存します。 ネイティブメソッドがマシンコードにコンパイルされるときは常に、通常、ネイティブメソッドスタックを使用して状態を追跡します。
JVMは、新しいスレッドを作成するたびにこれらのスタックを作成します。 したがって、JVMスレッドはこの領域を共有しません。
2.3. 実行エンジン
実行エンジンは、メモリ領域にある情報を使用して命令を実行します。 次の3つの部分があります。
通訳
クラスローダーがバイトコードをロードして検証すると、インタープリターはバイトコードを1行ずつ実行します。 この実行は非常に遅いです。 インタープリターの欠点は、1つのメソッドが複数回呼び出されると、新しい解釈が必要になるたびに発生することです。
ただし、JVMはJIT Compilerを使用してこの欠点を軽減します。
ジャストインタイム(JIT)コンパイラ
JITコンパイラは、実行時に頻繁に呼び出されるメソッドのバイトコードをネイティブコードにコンパイルします。 したがって、Javaプログラムの最適化を担当します。
JVMは、実行されているメソッドを自動的に監視します。 メソッドがJITコンパイルの対象になると、マシンコードへのコンパイルがスケジュールされます。 このメソッドは、ホットメソッドとして知られています。 このマシンコードへのコンパイルは、別個のJVMスレッドで行われます。
その結果、現在のプログラムの実行が中断されることはありません。 マシンコードへのコンパイル後、より高速に実行されます。
ガベージコレクタ
Javaは、ガベージコレクションを使用してメモリ管理を行います。 これは、ヒープメモリを調べ、使用中のオブジェクトと使用されていないオブジェクトを特定し、最後に未使用のオブジェクトを削除するプロセスです。
GCはデーモンスレッドです。 System.gc _()_メソッドを使用して明示的に呼び出すことができますが、すぐには実行されず、JVMがGCを呼び出すタイミングを決定します。
2.4. Javaネイティブインターフェイス
Javaコードとネイティブ(C / C ++)ライブラリ間のインターフェイスとして機能します。
プラットフォームに依存する機能を実装するなど、Javaだけではアプリケーションのニーズを満たせない場合があります。
そのような場合、JNIを使用して、JVMで実行されているコードを呼び出すことができます。 逆に、ネイティブメソッドがJVMで実行されているコードを呼び出すことができます。
2.5. ネイティブライブラリ
これらはプラットフォーム固有のライブラリであり、ネイティブメソッドの実装が含まれています。
3. JRE
Javaランタイム環境(JRE)は、Javaアプリケーションの実行に使用されるソフトウェアコンポーネントのバンドルです。
JREのコアコンポーネントは次のとおりです。
-
Java仮想マシン(JVM)の実装
-
Javaプログラムの実行に必要なクラス
-
プロパティファイル
上記のセクションでJVMについて説明しました。 ここでは、コアクラスとサポートファイルに焦点を当てます。
3.1. ブートストラップクラス
ブートストラップクラスはjre/lib/の下にあります。 This path is also known as the bootstrap classpath.含まれるもの:
-
rt.jarのランタイムクラス
-
i18n.jarの国際化クラス
-
charsets.jarの文字変換クラス
-
その他
ブートストラップClassLoaderは、JVMの起動時にこれらのクラスをロードします。
3.2. 拡張クラス
拡張クラスは、Javaプラットフォームの拡張機能のディレクトリとして機能するjre/lib/extn/にあります。 This path is also known as extension classpath.
これには、jfxrt.jarのJavaFXランタイムライブラリと、java.textおよびjava.utilパッケージのロケールデータがlocaledata.jarに含まれています。 ユーザーは、このディレクトリにカスタム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アプリケーションの作成と構築に使用されます。 Among these tools, we can find utilities for compiling, debugging, archiving, generating Javadocs, etc.
それらは含まれます:
-
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はネットワーク認証プロトコルです。
チケットに基づいて動作し、ノードが安全でないネットワークを介して通信し、安全な方法で互いの身元を証明できるようにします。
-
Kerberosチケット許可チケットの取得とキャッシュに使用されるkinit –
-
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. Java IDLおよびRMI-IIOPツール
Javaインターフェイス定義言語(IDL)は、JavaプラットフォームにCommon Object-Based Request Broker Architecture(CORBA)機能を追加します。
これらのツールにより、分散Java Webアプリケーションは、業界標準のObject Management Group(OMG)– IDLを使用して、リモートネットワークサービスの操作を呼び出すことができます。
同様に、Internet InterORB Protocol(IIOP)を使用できます。
RMI-IIOP、つまり RMI over IIOPは、RMI APIを介してCORBAサーバーとアプリケーションのプログラミングを可能にします。 したがって、Internet InterORB Protocol(IIOP)を介して、CORBA準拠の言語で記述された2つのアプリケーション間の接続が可能になります。
これらのツールは次のとおりです。
-
オブジェクト参照用のツリー構造のディレクトリを提供するtnameserv –の一時的なネーミングサービス
-
idlj –指定されたIDLファイルのJavaバインディングを生成するためのIDL-to-Javaコンパイラ
-
orbd – enableクライアントは、CORBA環境のサーバー上の永続オブジェクトを透過的に見つけて呼び出すことができます
-
servertool –は、永続サーバーをORBデーモンに登録または登録解除したり(orbd)、ORBデーモンに登録された永続サーバーを起動およびシャットダウンしたりするためのコマンドラインインターフェースを提供します。
4.6. Java展開ツール
These tools help in deploying Java applications and applets on the web.次のものが含まれます。
-
pack200 –は、Javagzipコンプレッサーを使用してJARファイルをpack200ファイルに変換します
-
unpack200 –はpack200ファイルをJARファイルに変換します
4.7. Javaプラグインツール
JDKはhtmlconverter.を提供します。さらに、Javaプラグインと組み合わせて使用されます。
一方では、Java Plug-inは一般的なブラウザとJavaプラットフォーム間の接続を確立します。 この接続の結果、Webサイト上のアプレットはブラウザー内で実行できます。
一方、htmlconverterは、アプレットを含むHTMLページをJavaプラグインの形式に変換するためのユーティリティです。
4.8. Java Web Startツール
JDKはjavaws. をもたらします。JavaWebStartと組み合わせて使用できます。
This tool allows us to download and launch Java applications with a single click from the browser.したがって、インストールプロセスを実行する必要はありません。
4.9. 監視および管理ツール
These are great tools that we can use to monitor JVM performance and resource consumption.これらのいくつかを次に示します::
-
jconsole –は、Javaアプリケーションを監視および管理できるグラフィカルコンソールを提供します
-
jps –は、ターゲットシステムでインストルメントされたJVMを一覧表示します
-
jstat –はJVM統計を監視します
-
jstatd –は、インストルメント化されたJVMの作成と終了を監視します
4.10. トラブルシューティングツール
These are experimental tools that we can leverage for troubleshooting tasks:
-
info –は、指定されたJavaプロセスの構成情報を生成します
-
jmap –は、指定されたプロセスの共有オブジェクトメモリマップまたはヒープメモリの詳細を出力します
-
jsadebugd –はJavaプロセスに接続し、デバッグサーバーとして機能します
-
jstack –は、特定のJavaプロセスのJavaスレッドのJavaスタックトレースを出力します
5. 結論
この記事では、JVM、JRE、およびJDKの基本的な違いはその使用方法にあることを確認しました。
最初に、JVMがJavaバイトコードを実際に実行する抽象コンピューティングマシンである方法を説明しました。
次に、Javaアプリケーションを実行する方法を説明しました。JREを使用します。
そして最後に、JDKを使用してJavaアプリケーションを開発する方法を理解しました。
また、このコンポーネントのツールと基本的な概念を掘り下げるのにも時間がかかりました。