Learn · concepts
JVMとは?Java仮想マシン解説
JVMは、あらゆるオペレーティングシステム上でJavaバイトコードを実行します。Minecraft Java EditionやFabricのすべてのMODが、Windows、macOS、Linuxで同じように動作する理由はこれによります.
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 プログラムを実行するにも必要 |
| JRE | JVM と標準ライブラリ | Java プログラムを実行する際に必要 |
| JDK | JRE とコンパイラおよび開発ツール | 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はホットコードパスの最適化がより優れていることが多いため、速度が向上する可能性があります。
よくある質問
いいえ、Javaは言語です。JVMは、コンパイルされた出力が実行されるランタイムです。Kotlinのような他の言語も、バイトコードにコンパイルされ、同じJVM上で動作します.
Javaランタイムが必要です。これにはJVMが含まれます。多くのランチャーはそれを提供してくれるので、別にインストールしなくてもすでに持っている可能性があります.
JVMはバイトコードを実行します。JDKは、コンパイラやツールを含む、Javaプログラムを最初から構築するために使用するフル開発キットです.
まずバイトコードを解釈し、次にJITコンパイラがプログラム実行中に最も頻繁に実行されるコードをネイティブマシンコードに変換します。このウォームアップが起動コストであり、高速化はそれから得られます.