コンテンツにスキップ

プログラミング/Java仮想機械

出典: フリー教科書『ウィキブックス(Wikibooks)』

Java仮想機械 (Java Virtual Machine; JVM)

[編集]

Java仮想機械(JVM)は、Javaプログラムを実行するための仮想化されたコンピュータ環境です。JVMは、Javaの「Write Once, Run Anywhere(WORA)」のコンセプトを支える中心的な要素です。Javaプログラムは、最初にバイトコードと呼ばれる中間形式にコンパイルされ、JVMがこれを解釈または実行します。

JVMの役割

[編集]

JVMは以下の主要な役割を果たします:

  • バイトコードの実行: Javaコンパイラが生成したバイトコードを解釈し、実行します。
  • メモリ管理: ヒープ領域を使用してオブジェクトを管理し、ガベージコレクションで不要なメモリを自動的に解放します。
  • プラットフォームの抽象化: JVMがプラットフォームの違いを吸収するため、同じバイトコードが異なるオペレーティングシステムで動作します。
  • セキュリティ: サンドボックス環境を提供し、外部からの悪意のあるコードの実行を防ぎます。

JVMの構造

[編集]

JVMは主に以下のコンポーネントから構成されています:

クラスローダー
プログラムのクラスファイルをメモリに読み込み、リンクと初期化を行います。
実行エンジン
バイトコードを解釈またはネイティブコードに変換して実行します。以下の方法があります:
  • インタプリタ: バイトコードを1命令ずつ解釈します。
  • JIT(Just-In-Time)コンパイラ: 頻繁に使用されるコードをネイティブコードに変換し、高速に実行します。
メモリ管理
メモリは以下の領域に分けられます:
  • メソッドエリア: クラス情報や定数を格納します。
  • ヒープ: オブジェクトを動的に格納します。
  • スタック: メソッド呼び出しの情報(ローカル変数、実行中の命令)を格納します。
  • PCレジスタ: 現在実行中の命令アドレスを保持します。
  • ネイティブメソッドスタック: ネイティブコードの実行に使用されます。

JVMの実行プロセス

[編集]

以下は、JVMがJavaプログラムを実行する一般的な手順です:

  1. Javaソースコードのコンパイル
    ソースコード(例: HelloWorld.java)をjavacでバイトコード(例: HelloWorld.class)にコンパイルします。
    javac HelloWorld.java
    
  2. クラスローダーでバイトコードを読み込み
    クラスローダーがHelloWorld.classをメモリに読み込みます。
  3. バイトコードの実行
    JVMの実行エンジンが、バイトコードを解釈またはJITコンパイルして実行します。

JVMの例

[編集]

以下は、JVM上で動作するシンプルなJavaプログラムです。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, JVM!");
    }
}

このプログラムをコンパイルして実行する手順:

javac HelloWorld.java
java HelloWorld
実行結果:
Hello, JVM!

JVMの特徴と利点

[編集]
  • 移植性: 一度コンパイルされたバイトコードは、JVMを実装した任意のプラットフォームで実行可能。
  • セキュリティ: サンドボックスを通じて安全な実行環境を提供。
  • 効率性: JITコンパイルにより、ネイティブコードに近い速度を実現。

JVMはJavaだけでなく、ScalaやKotlinなどの他のプログラミング言語でも使用されることが多く、幅広いプラットフォームで活躍しています。