Learn · concepts

JVMとは?Java仮想マシン解説

JVMは、あらゆるオペレーティングシステム上でJavaバイトコードを実行します。Minecraft Java EditionやFabricのすべてのMODが、Windows、macOS、Linuxで同じように動作する理由はこれによります.

TRtrolPublished 1 min read

JVMとは?

JVM、つまりJava仮想マシンは、Javaコードを実行するプログラムです。Javaでコードを書き、コンパイラがそれをバイトコードに変換し、JVMがどのオペレーティングシステム上でもそのバイトコードを実行します。そのため、Minecraft Java Editionやそれに組み込まれたMODは、Windows、macOS、Linuxで再コンパイルなしに同じように動作します。JVMは、「一度書けばどこでも実行できる」を実現する抽象化層であり、単なるマーケティングスローガンではなく、現実のものとなっています.

JVM が実際に何をしているのか

JVM はソースコードではなく、バイトコードを実行します。Java プログラムをコンパイルすると、Windows や Mac の実行ファイルが生成されるわけではありません。JVM が理解できる、コンパクトな命令セットであるバイトコードでいっぱいのクラスファイルが生成されます。JVM はそれらの命令を読み込み、あなたのマシン上で実行します。

その余分なレイヤーこそがポイントです。同じバイトコードは JVM が存在する場所ならどこでも実行されるため、「一度書けばどこでも実行できる」ということが、Java が広く普及した理由の短縮版です。JVM は、その約束を叶える部分です。Fabric の mod の jar ファイルは、プレイヤーが Windows、macOS、または Linux のいずれを使用しているかにかかわらず、同じバイトコードを同じ JVM で実行するため、ハードウェアの違いを JVM が処理します。

JVM、JRE、および JDK

これらの 3 つの用語は混同されがちなので、以下に分類を示します。

用語概要必要なタイミング
JVMバイトコードを実行するエンジンどんな Java プログラムを実行するにも必要
JREJVM と標準ライブラリJava プログラムを実行する際に必要
JDKJRE とコンパイラおよび開発ツールJava プログラムを構築する際に必要

ゲームを起動するには、ランタイムだけあればプレイヤーは十分です。mod を開発する開発者は、まず Java をバイトコードにコンパイルするために、フル JDK が必要です。

JVM があなたのコードを高速に実行する方法

JVMは、まず1つ1つの命令を解釈することから始まります。実行中に、どのメソッドが最も多く呼び出されているかを監視します。これらのホットパスはJITコンパイラに渡され、その場でネイティブマシンコードに変換されます。ウォームアップ後、最も頻繁に実行されるコードはネイティブに近い速度で動作します。Minecraftが最初の数秒間はラグが発生し、その後安定するのは、このJITコンパイラがバックグラウンドで動作しているからです。

JVMはメモリも管理してくれます。ガベージコレクタは、不要になったオブジェクトを回収するため、Cのように手動でメモリを解放する必要はありません。このことが、Javaが書きやすく、モッダーにとって最初のプログラミング言語として一般的な理由の一つです。メモリ管理は組み込まれています。

Minecraftにとってなぜ重要なのか

Minecraft Java EditionはJVM上で動作し、それをターゲットとするすべてのユーティリティクライアントやMODも同様です。クライアント自身のコードは、Java、Kotlin、または他のJVM言語で記述できます。なぜなら、それらはすべてJVMが実行する同じバイトコードにコンパイルされるからです。FabricのMODは、バイトコードのJARファイルとして配布され、ローダーがゲーム起動時にそれをゲームに組み込み、JVMがそのすべてを1つのプロセスとして実行します.

これも、ランチャーがヒープサイズや使用するJavaのバージョンなどの設定を可能にしている理由です。ゲーム自体ではなく、ゲームをホストするJVMを設定していることになります。JVMに与えるメモリを増やすと、Minecraftが作業できるスペースが広がります。新しいJavaバージョンを選択すると、新しいJVMはホットコードパスの最適化がより優れていることが多いため、速度が向上する可能性があります。

よくある質問