1概要

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


2 JVM

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

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

それはそれ自身の命令セットを持つ抽象計算機であり、実行時に様々なメモリ領域を操作する。

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

  • クラスローダー

  • ランタイムデータ領域

実行エンジン


2.1. クラスローダ

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

リンクについての詳細な記事は/java-classloaders[class loaders]です。


2.2. 実行時データ領域

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

これらの分野を一つずつ考えてみましょう。

  • [。underline]#メソッド領域#**

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

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

  • [。underline]#ヒープ領域#**

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

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

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

  • Eden Space – それはYoung Generationスペースの一部です。作成すると

オブジェクト、JVMはこのスペースからメモリを割り当てます。
** サバイバースペース – それはまた若い世代のスペースの一部です。生存者

スペースはマイナーGCフェーズを生き残った既存のオブジェクトを含みます
GCの
** Tenured Space – これはOld Generationスペースとしても知られています。それ

長く生き残ったオブジェクトを保持します。基本的には、若い世代のオブジェクトに対してしきい値が設定され、このしきい値が満たされると、これらのオブジェクトはtenuredスペースに移動されます。

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

  • [。underline]#スタックエリア#**

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

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

  • ローカル変数配列 – すべてのローカル変数とパラメータを含みます

メソッドの
** オペランドスタック – 中間体を格納するためのワークスペースとして使用されます。

計算結果
** フレームデータ – 部分結果の保存、メソッドの戻り値、

そして例外の場合に対応するキャッチブロック情報を提供する

Exception

テーブルへの参照

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

  • [。下線]#PCレジスタ#**

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

  • [。underline]#ネイティブメソッドスタック#**

ネイティブメソッドは、Java以外の言語で書かれたものです。

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

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


2.3. 実行エンジン

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

  • [。underline]#インタプリタ#**

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

ただし、JVMはこの不利な点を軽減するためにJITコンパイラを使用します。

  • [。underline]#ジャストインタイム(JIT)コンパイラ#**

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

JVMはどのメソッドが実行されているかを自動的に監視します。メソッドがJITコンパイルに適格になると、それはマシンコードにコンパイルされる予定です。この方法は、ホットメソッドとして知られています。このマシンコードへのコンパイルは別のJVMスレッドで行われます。

その結果、現在のプログラムの実行を中断することはありません。

マシンコードにコンパイルした後は、実行速度が速くなります。

  • [。underline]#ガベージコレクタ#**

Javaは、ガベージコレクションを使用してメモリ管理を行います。これは、ヒープメモリを調べ、どのオブジェクトが使用中でどのオブジェクトが未使用であるかを特定し、最後に未使用のオブジェクトを削除するプロセスです。

GCはデーモンスレッドです。

__System .


gc

()__メソッドを使用して明示的に呼び出すことができますが、すぐには実行されず、JVMがいつGCを呼び出すかを決定します。


2.4. Javaネイティブインタフェース

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

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

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


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

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


3 JRE

Java Runtime Environment(JRE)は、Javaアプリケーションを実行するために使用されるソフトウェアコンポーネントのバンドルです。

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

  • Java仮想マシン(JVM)の実装

  • Javaプログラムを実行するために必要なクラス

  • プロパティファイル

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


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

ブートストラップクラスは

jre/lib/

にあります。 ** このパスは、ブートストラップクラスパスとも呼ばれます。


  • rt.jar

    の実行時クラス


  • i18n.jar

    の国際化クラス


  • charsets.jar

    の文字変換クラス

  • その他

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


3.2. 拡張クラス

拡張機能クラスは

jre/lib/extn/

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

これには、

jfxrt.jar

内のJavaFXランタイムライブラリ、および

localedata.jar

内の

java.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はネットワーク認証プロトコルです。

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


  • kinit –

    はKerberosチケット許可チケットを取得してキャッシュするために使用されます


  • ktab –

    は、キーテーブルの原則名とキーペアを管理します。


  • klist –

    は、ローカル認証情報キャッシュとキー内のエントリを表示します

4.3. 国際化ツール

国際化は、技術的な変更なしにさまざまな言語や地域に適応できるようにアプリケーションを設計するプロセスです。

  • この目的のために、JDKは

    __native2asciiをもたらします。

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

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

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

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


  • rmic –

    は、リモートオブジェクトのスタブクラス、スケルトンクラス、およびtieクラスを生成します。

Javaリモートメソッドプロトコル(JRMP)またはインターネットInter-Orbの使用
プロトコル(IIOP)
**

rmiregistry –

は、リモートオブジェクトレジストリを作成して起動します。


  • __rmid – s

    __起動システムデーモンを起動します。これにより、オブジェクトは

Java仮想マシンに登録してアクティブ化する
**

serialver –

は、指定されたクラスのシリアルバージョンUIDを返します

4.5. Java IDLとRMI-IIOPツール

IDL(Java Interface Definition Language)は、JavaプラットフォームにCORBA(Common Object-Based Request Broker Architecture)機能を追加します。

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

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

RMI − IIOP、すなわちRMI over IIOPは、RMI APIを介してCORBAサーバおよびアプリケーションのプログラミングを可能にする。したがって、インターネットInterORBプロトコル(IIOP)を介して、CORBA準拠の言語で書かれた2つのアプリケーション間の接続を可能にします。

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


  • tnameserv –

    一時ネームサービス

オブジェクト参照用のツリー構造ディレクトリ
**

idlj –

Javaバインディングを生成するためのIDLからJavaへのコンパイラ

指定されたIDLファイル
** ____orbd – 透過的にクライアントを検索して呼び出す

CORBA環境のサーバー上の永続オブジェクト
**

servertool –

は、登録するためのコマンドラインインタフェースを提供します。

永続サーバーのORBデーモン(

orbd

)への登録解除、ORBデーモンに登録されている永続サーバーの起動と停止など

4.6. Java配備ツール

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


  • pack200 – Javaを使用してJARファイルを

    pack200__ファイルに変換します。


gzip

コンプレッサー
**

unpack200 –


pack200

ファイルをJARファイルに変換します。

4.7. Java Plug-inツール

  • JDKは__htmlconverterを提供しています。さらに、これはJava Plug-inと組み合わせて使用​​されます。**

一方では、Java Plug-inは一般的なブラウザとJavaプラットフォーム間の接続を確立します。この接続の結果として、Webサイト上のアプレットはブラウザ内で実行される可能性があります。

一方、

htmlconverter

は、アプレットを含むHTMLページをJava Plug-in用の形式に変換するためのユーティリティです。

4.8. Java Web Startツール

JDKは

__javawsをもたらします。

__Java Web Startと組み合わせて使用​​できます。

  • このツールを使用すると、ブラウザからシングルクリックで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を使用します。

また、このコンポーネントのツールと基本的な概念についても詳しく説明しました。