JVM(Java Virtual Machine/Java仮想マシン)とは、Javaで書かれたプログラムを、それぞれのコンピューターの上で実際に動かすためのソフトウェアのことです。WindowsでもLinuxでもmacOSでも、JVMさえ用意すれば同じJavaのプログラムを動かせるため、Javaが広く使われる大きな理由になっています。
現実世界に例えると、JVMはどの国の会場にも同じ通訳を連れて行く講演者のようなものです。講演の原稿はひとつだけでも、通訳がその場の言葉に置き換えてくれるので、どこでも同じ内容を伝えられます。
中間の言葉「バイトコード」
仕組みの出発点です。Javaのプログラムは、まず「バイトコード」と呼ばれる、特定のCPUやOSに依存しない中間の形に変換されます。この形のファイルを配布しておけば、受け取った側のJVMが、自分のコンピューターに合わせて実行してくれます。「一度書けば、どこでも動く」という考え方を支える仕組みです。
実行しながら速くする
速さを出す工夫です。JVMは、最初はバイトコードを少しずつ読みながら実行し、何度も使われる部分を見つけると、そのコンピューター向けの命令に変換して高速に動かします。この仕組みを「JITコンパイル」と呼びます。動かし続けるほど速くなるため、長時間動くサーバーの処理に向いています。
メモリの後片付けを自動で行う
JVMの大きな役割です。使い終わったデータが占めているメモリを自動で見つけて解放する「ガベージコレクション」という機能を持っています。プログラムを書く人がメモリの解放を細かく管理しなくてよいため、解放し忘れによる不具合が起きにくくなり、大きなシステムを安全に作りやすくなります。
JDK・JREとの関係
似た名前の言葉との違いです。JVMはプログラムを動かす部分そのもので、それに必要な部品をまとめたものがJRE、さらに開発のための道具まで含めたものがJDKです。現在は、JREだけを個別に配布する形は少なくなり、JDKを入れて使うのが一般的になっています。
| 名前 | 含まれるもの | 必要な人 |
|---|---|---|
| JVM | プログラムを動かす仕組み | - |
| JRE | JVM+標準の部品群 | Javaのソフトを使う人 |
| JDK | JRE+開発の道具 | Javaで開発する人 |
Java以外の言語も動く
意外な広がりです。バイトコードに変換できれば、Java以外の言語で書かれたプログラムもJVMの上で動かせます。Androidアプリの開発で使われるKotlinや、データ処理で使われるScalaなどがその例です。JVMの上で育った豊富な部品をそのまま使えることが、こうした言語の強みになっています。
いくつもの実装がある
JVMはひとつだけではありません。JVMの動きは仕様として公開されており、それに沿って作られた実装が複数存在します。もっとも広く使われているのはOpenJDKに含まれるHotSpotで、ほかにも起動の速さやメモリの少なさを重視したものなどがあり、用途に合わせて選べます。
使うメモリの量を設定する
運用での調整です。JVMは、起動するときにプログラムが使ってよいメモリの上限などを指定でき、扱うデータの量に合わせて調整します。上限が小さすぎるとメモリ不足で処理が止まり、大きすぎるとほかのソフトを圧迫します。サーバーで動かす場合は、こうした設定を見直すことが性能を引き出す鍵になります。
起動の遅さとメモリの多さ
弱点もあります。JVMは起動してから本来の速さを出すまでに時間がかかり、使うメモリも多くなりがちです。短い時間だけ動く処理や、小さな機器では不利になることがあります。そのため、あらかじめ機械語に変換しておく技術など、起動を速くするための改良が続けられています。
あわせて知っておきたい用語
- Java:
業務システムなどで広く使われているプログラミング言語です。 - 仮想マシン:
ソフトウェアによって作り出された、仮想的なコンピューターです。 - ガベージコレクション:
使われなくなったメモリを自動で解放する仕組みです。 - Kotlin:
JVM上で動き、Androidアプリ開発で広く使われる言語です。

コメント