JDK、JRE、JVMの違いと連携を徹底解説
Java Development Kit (JDK)とは
JDKは、開発者がJavaアプリケーションの作成、コンパイル、デバッグ、実行を行うための包括的なツールキットです。Javaコンパイラ(javac)、コアクラスライブラリ、デバッガやJavaDocなどの開発ツール一式が同梱されています。Windows、macOS、Linux、Solarisで利用可能で、複数バージョンを同一マシンに共存させられます。
Java Runtime Environment (JRE)とは
JREは、コンピュータでJavaプログラムを実行するためのランタイムパッケージです。Java Virtual Machine (JVM)、コアライブラリ、サポートファイルがバンドルされています。開発を行わないエンドユーザーは、フルJDKの代わりにJREのみをインストールできます。
Java Virtual Machine (JVM)とは
JVMは、Javaバイトコードをネイティブマシン語に解釈またはJITコンパイルするエンジンです。Javaプラットフォームの核であり、プラットフォーム非依存の実行、メモリ管理、セキュリティを提供します。
なぜJDKを使うのか
- Javaアプリケーション構築に必要なコンパイラ、デバッガ、ランチャーを含む
- 任意のJVMで動作するバイトコード生成を可能にする
- パフォーマンスチューニング、コード分析、ドキュメント生成ツールを提供
なぜJREを使うのか
- 開発ツールのオーバーヘッドなしでJavaアプリケーションを実行できる環境を提供
- ほとんどのJavaプログラムに必要なコアライブラリ一式を含む
- Javaソフトウェアを実行するだけのエンドユーザーに最適
なぜJVMを使うのか
- 互換性のあるJVMを持つあらゆるプラットフォームでJavaバイトコードを実行し、「Write once, run anywhere」を実現
- 実行時にパフォーマンスを最適化するJust-In-Time (JIT) コンパイラを搭載
- メモリ割り当て、ガベージコレクション、セキュリティチェックを処理
JDKの主な機能
- コンパイラ、デバッガ、JavaDocなど開発ツール一式
- ダイヤモンド演算子(
<>)などモダン言語機能をサポート - クロスプラットフォーム: Windows、macOS、Linux、Solarisにインストール可能
- JREの全コンポーネントを含むスーパーセット
JREの主な機能
- Javaアプリケーション実行に必要なJVMとコアクラスライブラリを含む
- Java Web StartやJavaプラグインなどの導入技術を提供
- JDBC、RMI、JNDIなどのネットワーク・データベースAPIを含む
- 開発ツールを除外し、パッケージを軽量化
JVMの主な機能
- バイトコードを解釈、またはJITでコンパイルして効率的に実行
- メモリ、ガベージコレクション、セキュリティポリシーを管理
- クラスローダ、メソッドエリア、ヒープ、スタックなど柔軟なアーキテクチャ
- ハードウェア非依存: 同じバイトコードが互換JVM搭載プラットフォームで動作
JDKの仕組み
JDKはJREを内包し、開発ツールを追加しています。開発者がコードを書き、javacでバイトコードにコンパイルし、Javaランチャー(java)がJVMを起動してプログラムを実行します。
JREの仕組み
JREはJVM、クラスローダ、ランタイムライブラリを含みます。プログラム起動時、JVMがクラスをロードし、バイトコードを検証し、インタプリタまたはJITコンパイラで実行します。
JVMの仕組み
JVMの主要コンポーネント:
- クラスローダ: クラスファイルのロード、リンク、初期化
- メソッドエリア: クラス構造、静的変数、メソッドバイトコードを格納
- ヒープ: スレッド間で共有されるオブジェクトと配列を保持
- Javaスタック: スレッドごとのローカル変数とメソッドフレームを格納
- PCレジスタ: スレッドごとの現在実行中命令を追跡
- 実行エンジン: バイトコードを実行。ホットスポットをJITでコンパイル
- ネイティブメソッドインターフェース & ライブラリ: ネイティブコードとの連携を可能にする
JDK、JRE、JVMの比較
| コンポーネント | 正式名称 | 目的 | プラットフォーム依存性 | 含まれるツール |
|---|---|---|---|---|
| JDK | Java Development Kit | Javaアプリケーションの完全な開発環境 | プラットフォーム依存 | コンパイラ、デバッガ、JavaDocなど |
| JRE | Java Runtime Environment | コアライブラリとJVMを提供し、Javaアプリケーションを実行 | プラットフォーム依存 | なし(ランタイムのみ) |
| JVM | Java Virtual Machine | Javaバイトコードを実行。プラットフォーム非依存ランタイムを提供 | プラットフォーム依存(実装による) | なし(実行エンジンのみ) |
Java
- Javaロギングのマスターガイド:信頼性の高いコードのための必須ベストプラクティス
- JavaのJDK、JRE、JVMを理解する:違いを徹底解説
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java if…elseをマスター:制御フローを徹底解説
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Java 10でJDKフォレストを単一リポジトリに統合
- Java 10のスレッドローカルハンドシェイク:VMセーフポイント高速化でパフォーマンス向上