Java仮想マシン(JVM: Java Virtual Machine)とは、Javaの中間バイトコードを実行するためのプログラムである[1]。
概要
Javaバイトコード[2]として定義された命令セットを実行する仮想マシン。
それぞれのOS向けのJava仮想マシンがバイトコードを解釈して同じ結果をもたらすように設計されているため、OSが異なっていても同じバイナリファイルをそのまま実行できる。
Java仮想マシンの実装がきちんとできていないと上記前提が崩れるので、Java仮想マシンを名乗るにはOracleのテストに合格しないといけないとかいろいろあるらしい。
パフォーマンス
実行開始後に中間バイトコードをJava仮想マシンでネイティブコード(機械語)に変換して実行するので、C言語などのネイティブコードよりも遅いということがしばしば批判されるが、さまざまな最適化の成果により現在ではネイティブコードにひけを取らないレベルにまで至っている。
セキュリティ
サンドボックスモデルを採用し、限られたメモリ空間内のみで動作するから安全! なはずなのだが、しばしばセキュリティホールが見つかり、ブラウザ側からセキュリティホールが改善されるまでプラグインを無効にされるというペナルティを受けたことも[3]。
2013年にはJava 8のリリースを延期して開発資源をセキュリティ対策に回すなどの対応がなされ、それ以降はある程度改善したのではないかと思われる。
Java以外のJVM言語
バイトコードそのものはJavaを前提としているものの、Java言語専用というものではないため、他言語でもバイトコードに変換すればJava仮想マシンで動作させることができる。
→ JVM言語参照
実行環境(JRE: Java Runtime Environment)
すべての環境に共通すること(Java Standard Edition)
Java SEと略される。ハードウェア性能の向上も手伝い、図形・文字描画機能の向上、GUI表現力の拡張、インストールの簡素化などがなされたため、主にクロスプラットフォームなデスクトップアプリケーション開発において有用性が高い。
こういった機能を有効活用した、ニコニコ内で有名なソフトウェアとしてはJavieやMikuMikuStudioが挙げられる。
実行にはJavaのインストールが必要。実行開始時にJava仮想マシンを起動してから実行する[4]ので、小さな処理をするプログラムではJava仮想マシンを起動する時間がプログラムの実行時間よりも長くなることがあり、やや敷居が高い。
エンタープライズ(Java Enterprise Edition → Jakarta EE)
主に大規模なWebサービス(サーバ側)、また会社間(B2B)システム、ECサイト(電子商取引サイト)、社内イントラシステム等、「会社の中の人向け」のシステム構築言語として広く使われている。Java EEと略されるが、「エンタープライズ」向けとして安定性が求められるためか同じバージョンのJava SEよりも1年以上遅れてリリースされることが多い。
最近では実行環境の監視などのノウハウが溜まっているなど、スケールアウトのしやすさから所謂「クラウド」において開発用途に使われる。
また JenkinsやApache Hadoopといった開発向けミドルウェアの動作環境として用いられている。
Eclipse Foundationへの移管とJakarta EEへの名称変更
Java EE 8 はJava SE 8が2014年にリリースされた後3年経ってもリリースされず、一時はこのまま見捨てられるのではないかという噂が出てOracle側がこれを否定する一幕もあったが、2017年9月にJava SE 9と同時にリリースされた。しかし、2018年3月にEclipse Foundationに移管され結局Oracleから捨てられた。
移管に際して、OracleがJavaの名称使用継続を拒否したため、新しい名称について投票が行われ、Jakarta EEという名称に変更された。
携帯電話・組込み機器(Java Micro Edition)
モバイル向けアプリの分野、特に携帯電話では他に選択肢がないという理由で機能制限つきのJavaが使われている(iアプリ、オープンアプリ、MIDPなど)
これらはまとめて「Java Micro Edition」と言われてはいるものの、「標準仕様」といったものはなく、それそれのキャリア対象に合わせた制作が必要なためコストが嵩むことが問題視されていた。
アプレット
こちらに移設しました。
スマホ(Android)
こちらに移設しました。
Java仮想マシンの実装
Oracleの有償のテストに合格すればJava仮想マシンを名乗ることが出来るので、実装は複数存在する。
Oracle JDK
Java仮想マシンといえば、Javaの名称に関する権利を有する(Sunを買収した)Oracleが提供するものがデファクトスタンダードである。
しかし、2019年4月にライセンス条件が変更され、非商用や開発目的以外は有償ライセンス契約が必要になった。Java9以降はサポート期間(修正アップデート提供期間)が半年のものと、サポート期間3年のLTS版(Long Term Support版)がある。
JavaFXはJava 8までは同梱されているが、Java 9以降には含まれておらず、Gluonが提供するバイナリなどに頼らねばならない。
また32ビット版もJava 8までの提供で、Java 9以降は全てのプラットフォームで64bit版のみとなっている。
OpenJDK
オープンソース実装。Java7の時代にリファレンス実装に指定されるようになった。実質的にはOracle JDKと同じものだが、Oracleの有償契約版と異なり各バージョンのサポート期間はすべて半年でありLTS版はない。サポートがあるのは常に最新バージョンのJavaのみである。
バイナリはOracleが評価・参考用途として提供しているが、ライセンスはオープンソースライセンスなので、自己責任なら商用にも自由に使って良いのではなかろうか。商用利用のためのバイナリは上記Oracle JDKを有償で使用するようにとのこと。
OpenJDKでは、JavaFXはOpenJFXという独立したプロジェクトの扱いとなっており、一貫してJava仮想マシンには非同梱の立場をとっている。
こちらもJava 9以降は64bit版のみの提供となっている。
Microsoft Java Virtual Machine
AdoptOpenJDK
Red Hatが提供するJava 8以降のOpenJDKのバイナリが手に入る。JavaFXは同梱されていない。基本的に64ビット版のみであるが、Windows用とARM用は32ビット版がある。
Amazon Corretto
OracleのJava有償化の発表後に参入してきたAmazonのOpenJDKによる実装。
メインターゲットはAWS(Amazon Web Service)だが、各種環境で動く。
JavaFXをバンドルしているのだが、WebKitなど一部の機能がライセンスの関係で除外されている。JavaFXをバインドしている背景にAWSの機能提供に使用されているからということがあるらしく、AWSで使用しない機能はどうでもいい実装が延び延びになってしまうようだ。
Liberica JDK
BellSoftという会社のJDK。Javaの品質テストにも合格している。
BellSoftというのはあまり聞いたことがない会社だが、IntelliJ IDEAで有名なJetBrains社と提携しており、それなりに素性は確かなようだ。
JavaFXをバンドルしている。JDKでなく、ランタイムのみのJRE(Java Runtime Environment)もある。32ビット版もある。
関連項目
脚注
- *ARM等の組み込み向けCPUにおいてJavaバイトコードを直接ハードウェアで実行する技術(Jazelle)が搭載されていたこともあったが、2013年ごろから登場した最新のアーキテクチャARMv8ではその後継技術と共に不採用になっている
- *Java仮想マシンにとっての機械語に相当する。名前は1命令が1バイトであることに由来する。
- *こういったペナルティはAdobe Flash Playerも受けたことがあるので、Javaはセキュリティが弱い、というよりリッチ・クライアントでセキュリティを確保するのは難しいということかもしれない。
- *1997年より前の最初期:バージョン1.0ではバイトコードからネイティブコードへのコンパイルまで実行前に行なっていた。
- 1
- 0pt