
Javaは、アプリケーションソフトウェアの開発とクロスプラットフォームコンピューティング環境への展開を可能にするソフトウェアプラットフォームを提供する、一連のコンピュータソフトウェアおよび仕様です。Javaは、組み込み機器や携帯電話からエンタープライズサーバーやスーパーコンピュータまで、幅広いコンピューティングプラットフォームで使用されています。スタンドアロンのJavaアプリケーションほど一般的ではありませんが、Javaアプレットは、 HTMLページに埋め込むことでネイティブアプリケーションの多くの機能を提供するために、安全なサンドボックス環境で実行されるのが一般的でした。
Java プログラミング言語で記述することは、 Java 仮想マシン(JVM)にバイト コードとしてデプロイされるコードを生成する主な方法です。バイト コードコンパイラは、 Ada、JavaScript、Kotlin (Google が推奨する Android 言語)、Python、Rubyなど、他の言語でも利用可能です。さらに、Clojure、Groovy、Scalaなど、 JVM 上でネイティブに実行するように設計された言語もいくつかあります。Javaの構文はCとC++から多くを借用していますが、オブジェクト指向機能はSmalltalkとObjective-Cをモデルにしています。[ 9 ] Java はポインタなどの特定の低レベル構造を避け、オブジェクトがヒープに割り当てられる ( Oracle が現在サポートしている実装など、一部の実装では代わりにエスケープ解析最適化を使用してスタックに割り当てる場合があります)非常にシンプルなメモリ モデルを持ち、オブジェクト型のすべての変数は参照です。メモリ管理は、 JVM によって実行される統合された自動ガベージ コレクションによって処理されます。
最新バージョンは、 2026年3月にリリースされたJava 26です。
最新の長期サポート(LTS) バージョンであるJava 25 は2025 年 9 月にリリースされ、Java 8 LTS までサポートされている数少ない LTS バージョン 1 つです。Oracle の Java 6 の延長サポートは 2018 年 12 月に終了しました。[ 10 ]
オープンソースプラットフォームであるJavaには、Amazon、IBM、Azul Systems、AdoptOpenJDKなど、多くのディストリビューターが存在します。ディストリビューションには、Amazon Corretto、Zulu、AdoptOpenJDK、Libericaなどがあります。OracleはJava 8を配布しており、Java 11なども提供しています。どちらも現在サポートされているLTSバージョンです。Oracle(およびその他)は、未解決のセキュリティ問題による深刻なリスクがあるため、Java 8より古いバージョンのJavaをアンインストールすることを強く推奨しています。[ 11 ] [ 12 ] [ 13 ] [ 14 ]
Java 9(およびバージョン10、12~16、18~20、22~24)はサポート対象外となったため、Oracleはユーザーに対し、サポート対象バージョンへの「即時移行」を推奨しています。
Oracleは、旧バージョンのJava 8 LTS向けに商用利用向けの無料アップデートを 2019年1月に最後にリリースしましたが、個人利用向けのJava 8については、今後も無期限にアップデートのサポートを継続します 。
Javaプラットフォームは、 Javaプログラミング言語で記述されたプログラムの開発と実行を容易にする一連のプログラムです。Javaプラットフォームには、実行エンジン(仮想マシンと呼ばれる)、コンパイラ、およびライブラリ群が含まれます。要件によっては、追加のサーバーや代替ライブラリが必要になる場合もあります。Javaプラットフォームは、Javaプログラムがすべてのハードウェアおよびオペレーティングシステム上で同じように動作するように、幅広いハードウェアおよびオペレーティングシステム向けに実装されています。
Javaプラットフォームは複数のプログラムで構成されており、それぞれが全体の機能の一部を提供しています。例えば、JavaソースコードをJavaバイトコード(JVMの中間言語)に変換するJavaコンパイラは、 Java開発キット(JDK)の一部として提供されています。JVMを補完するJavaランタイム環境(JRE)は、ジャストインタイム(JIT)コンパイラを備え、中間バイトコードを実行時にネイティブマシンコードに変換します。Javaプラットフォームには、豊富なライブラリ群も含まれています。
プラットフォームの主要構成要素は、Java言語コンパイラ、ライブラリ、および仮想マシン仕様に定められた規則に従ってJava中間バイトコードが実行されるランタイム環境である。
プラットフォームによって、対象となるデバイスの種類やアプリケーション分野が異なる。
Java Platform, Standard Edition (Java SE) は、デスクトップ環境やサーバー環境向けの移植可能なコードなど、 独立したJava サポートプラットフォーム上でアプリケーションを実行するためのコンピューティング プラットフォーム、技術標準です。 [ 15 ] [ 16 ] Java SE は以前は Java 2 Platform, Standard Edition (J2SE) として知られていました。
このプラットフォームはJavaプログラミング言語を使用しており、Java ソフトウェア プラットフォーム ファミリーの一部です。Java SE は、Java クラス ライブラリのJava APIなど、さまざまな汎用APIを定義しており、 Java 言語仕様とJava 仮想マシン仕様も含まれています。 [ 17 ] OpenJDK はバージョン 7 以降、公式のリファレンス実装となっています。[ 18 ] [ 19 ] [ 20 ]
Jakarta EE(旧称:Java Platform, Enterprise Edition(Java EE)およびJava 2 Platform, Enterprise Edition(J2EE))は、Java SE [ 21 ]を拡張し、分散コンピューティングやWebサービスなどのエンタープライズ機能の仕様を追加した一連の仕様です。[ 22 ] Jakarta EEアプリケーションは、マイクロサービスまたはアプリケーションサーバーである参照ランタイム上で実行され、トランザクション、セキュリティ、スケーラビリティ、並行処理、およびデプロイするコンポーネントの管理を処理します。
Javaプラットフォームの中核は、Javaバイトコードプログラムを実行する「仮想マシン」です。このバイトコードは、プログラムが実行されるハードウェアやオペレーティングシステムに関係なく同じです。ただし、Java 10(およびそれ以前のバージョン)などの新しいバージョンでは、小さな変更が加えられているため、バイトコードは一般的に前方互換性のみを有しています。Java仮想マシン(JVM)内には、ジャストインタイム(JIT)コンパイラがあります。JITコンパイラは、実行時にJavaバイトコードをネイティブプロセッサ命令に変換し、実行中にネイティブコードをメモリにキャッシュします。
バイトコードを中間言語として使用することで、Java プログラムは仮想マシンが利用可能なあらゆるプラットフォームで実行できます。JIT コンパイラを使用することで、Java アプリケーションは、ロード中に少し遅延した後、すべてまたはほとんどが JIT コンパイルされて「ウォームアップ」されると、ネイティブ プログラムとほぼ同じ速度で実行される傾向があります。[ 23 ] [ 24 ] [ 25 ] JRE バージョン 1.2 以降、Sun の JVM 実装には、インタプリタの代わりにジャストインタイム コンパイラ が含まれています。
Javaプログラムはクロスプラットフォーム、つまりプラットフォームに依存しないものですが、これらのプログラムを実行するJava仮想マシン(JVM)のコードはそうではありません。サポートされているすべてのオペレーティングプラットフォームには、それぞれ独自のJVMがあります。
Java Development Kit (JDK) は、Javaプラットフォーム アプリケーションを開発するためのソフトウェア開発キットです。[ 26 ]
JDKは主にJavaランタイム環境(JRE)との通信を目的として設計されていますが、JREおよびJVMと通信できる他のJDKベースの言語に置き換えることも可能です。さらに、Javaバイトコードは、 JVMのみを使用して静的に直接ネイティブコードにコンパイルすることができ、Javaランタイム環境を動的に実行する必要はありません。
Java は、Java 言語仕様 (JLS) と Java 仮想マシン仕様 (JVMS) を実装し、Javaアプリケーション プログラミング インターフェイス(API) の標準版 (SE) を提供します。これは、Oracle が管理するコミュニティ主導のOpenJDKから派生したものです。[ 27 ] Java アプリケーションを操作するためのソフトウェアを提供します。含まれるソフトウェアの例としては、Java 仮想マシン、コンパイラ、パフォーマンス監視ツール、デバッガ、および Oracle が Java プログラマにとって有用だと考えるその他のユーティリティなどがあります。
Oracleは、Oracle No-Fee Terms and Conditions(NFTC)ライセンスに基づき、現行バージョンのソフトウェアをリリースしています。Oracleは、Windows、macOS、Linuxベースのオペレーティングシステム向けにx86-64アーキテクチャ用バイナリを、macOSおよびLinux向けにaarch64アーキテクチャ用バイナリをリリースしています。以前のバージョンでは、Oracle SolarisオペレーティングシステムおよびSPARCアーキテクチャをサポートしていました。
Oracleの主要なJVM実装はHotSpotとして知られています。
OracleがリリースしたJava Runtime Environment(JRE)は、スタンドアロンのJVM (HotSpot)、Java標準ライブラリ(Javaクラスライブラリ)、構成ツール、そしてJDK 9でサポートが終了するまではブラウザプラグインを含む、無料で利用できるソフトウェアディストリビューションです。これは、ノートパソコンやデスクトップパソコンにインストールされる最も一般的なJava環境です。フィーチャーフォンや初期のスマートフォンなど、JVMが同梱されている携帯電話には、JavaプラットフォームのMicro Editionをターゲットとしたアプリケーションを実行するためのJVMが含まれている可能性が高いです。一方、Javaアプリを実行する最新のスマートフォン、タブレットコンピュータ、その他のハンドヘルドPCのほとんどは、JVM仕様と互換性のないオープンソースの仮想マシンを含むAndroidオペレーティングシステムのサポートを通じて実行されている可能性が高いです。 (代わりに、Googleの Android 開発ツールは Java プログラムを入力として受け取り、Android デバイス上の仮想マシンのネイティブ入力フォーマットである Dalvik バイトコードを出力します。) Oracle BCL 契約[ 28 ]の JRE の最後のクリティカル パス アップデート バージョンは8u201 であり、同じライセンスの最後のパッチ セット アップデート バージョンは 8u202 でした。[ 29 ] [ 30 ]ライセンス スキームに関係なく、最後の Oracle JRE 実装は 9.0.4 でした。[ 31 ] Java Platform SE 9 以降、プラットフォーム全体もモジュールにグループ化されました。[ 32 ] Java SE 実装のモジュール化により、開発者は、ユーザー デバイスに適切な Java SE 実装が存在することだけに頼るのではなく、アプリケーションを、使用するすべてのモジュールとともにバンドルすることができます。[ 33 ] [ 34 ] [ 35 ] [ 36 ]
ほとんどの最新のオペレーティングシステム(OS)では、プログラマの作業を簡素化するために、再利用可能なコードが大量に提供されています。このコードは通常、アプリケーションが実行時に呼び出すことができる動的にロード可能なライブラリのセットとして提供されます。Javaプラットフォームは特定のオペレーティングシステムに依存しないため、アプリケーションは既存のOSライブラリに頼ることはできません。代わりに、Javaプラットフォームは、最新のオペレーティングシステムで一般的に見られる多くの再利用可能な関数を含む、独自の標準クラスライブラリの包括的なセットを提供します。システムライブラリの大部分もJavaで記述されています。たとえば、Swingライブラリはユーザーインターフェイスを描画し、イベントを自身で処理するため、異なるプラットフォーム間でコンポーネントを処理する方法の多くの微妙な違いが解消されます。
Javaクラスライブラリは、Javaプラットフォーム内で3つの役割を果たします。まず、他の標準コードライブラリと同様に、Javaライブラリは、アイテムのリストの管理や複雑な文字列解析など、一般的なタスクを実行するためのよく知られた関数セットをプログラマに提供します。次に、クラスライブラリは、通常はハードウェアとオペレーティングシステムに大きく依存するタスクに対して、抽象的なインターフェースを提供します。ネットワークアクセスやファイルアクセスなどのタスクは、多くの場合、各プラットフォーム固有の実装と密接に結びついています。これらjava.netのjava.ioライブラリは、ネイティブOSコードで抽象化レイヤーを実装し、Javaアプリケーションがこれらのタスクを実行するための標準インターフェースを提供します。最後に、基盤となるプラットフォームがJavaアプリケーションが期待するすべての機能をサポートしていない場合、クラスライブラリは、代替機能を提供するエミュレーション、または少なくとも特定の機能の存在を確認する一貫した方法を提供することによって、欠落しているコンポーネントを適切に処理します。
「Java」という単語単独では、通常、Javaプラットフォームで使用するために設計されたJavaプログラミング言語を指します。プログラミング言語は通常、「プラットフォーム」というフレーズの範囲外ですが、Javaプログラミング言語はJava 7以前はJavaプラットフォームの中核部分として挙げられていました。そのため、言語とランタイムは一般的に単一のユニットとして考えられていました。しかし、Java 7仕様では、Java言語とJava仮想マシンをより明確に別々のエンティティとして扱うようにする努力がなされ、もはや単一のユニットとは見なされなくなりました。[ 37 ]
サードパーティは、JVMをターゲットとする多くのコンパイラやインタプリタを開発してきました。これらの中には既存の言語向けのものもあれば、Java言語の拡張機能向けのものもあります。これらには以下が含まれます。
Javaの成功と「一度書けばどこでも実行できる」というコンセプトは、他の同様の取り組みにつながり、特に2002年以降に登場した.NET Frameworkは、Javaの成功した多くの側面を取り入れています。.NETは複数のプログラミング言語をサポートするためにゼロから構築されましたが、Javaプラットフォームは当初Java言語のみをサポートするように構築されましたが、その後、JVM向けに他の多くの言語が開発されました。Javaと同様に、.NET言語はバイトコードにコンパイルされ、 JVMと同様の目的を持つ共通言語ランタイム(CLR)によって実行されます。JVMと同様に、CLRは自動ガベージコレクションによってメモリ管理を提供し、.NETバイトコードを複数のオペレーティングシステムで実行できるようにします。
.NETには、当初J++と呼ばれ、後にVisual J#と改名されたJavaに似た言語が含まれていましたが、これはJavaの仕様と互換性がありませんでした。2007年に開発が中止され、2015年にサポートが終了しました。
JVMの仕様では、実装の詳細に関して実装者に多くの裁量が与えられています。Java 1.3以降、OracleのJREにはHotSpotと呼ばれるJVMが搭載されています。これは高性能なJVMとして設計されています。
コード実行速度を向上させるため、HotSpotはジャストインタイムコンパイルを採用しています。また、オブジェクトの割り当てとガベージコレクションを高速化するために、世代別ヒープを使用しています。
Java仮想マシンのヒープは、JVMが動的メモリ割り当てに使用するメモリ領域です。[ 39 ]
HotSpotでは、ヒープは世代に分割されます。
Java 8 より前は、クラス定義と関連するメタデータにパーマネントジェネレーション(またはpermgen ) が使用されていました。パーマネント ジェネレーションはヒープの一部ではありませんでした。[ 40 ] [ 41 ]パーマネントジェネレーションは Java 8 から削除されました。[ 42 ]
当初は永続的な生成はなく、オブジェクトとクラスは同じ領域に一緒に格納されていました。しかし、クラスのアンロードはオブジェクトの収集よりもはるかにまれにしか発生しないため、クラス構造を特定の領域に移動することでパフォーマンスが大幅に向上しました。[ 40 ]
Java JRE は多数のコンピュータにインストールされています。そのため、古いバージョンの JRE を使用しているエンドユーザーは、多くの既知の攻撃に対して脆弱です。このことから、Java は本質的に安全ではないという広く共有された認識が生まれました。[ 43 ] Java 1.7 以降、Oracle の JRE for Windows には自動更新機能が含まれています。
Java ブラウザ プラグインが廃止される前は、どの Web ページでも Java アプレットが実行される可能性があり、悪意のある Web サイトにとって攻撃しやすい領域となっていました。2013 年に Kaspersky Labs は、Java プラグインがコンピュータ犯罪者にとって好まれる方法であると報告しました。Java エクスプロイトは、ハッカーがハッキングした Web サイトに展開する多くのエクスプロイト パックに含まれています。[ 44 ] Java アプレットは、2018 年 9 月 25 日にリリースされた Java 11 で削除されました。

Javaは1990年12月にSun Microsystemsの社内プロジェクトとして始まり、C++/ Cプログラミング言語の代替となるものを提供しました。エンジニアのパトリック・ノートンは、SunのC++およびCアプリケーションプログラミングインターフェース(API)とツールの現状、そしてNeWSプロジェクトが組織によって扱われている方法にますます不満を募らせていました。ノートンはスコット・マクニーリーにSunを辞めてNeXTに移る計画を伝え、マクニーリーはノートンに自分が神であるかのように振る舞い、会社を立て直す方法を説明するメールを送ってほしいと頼みました。ノートンは、他のSunプロジェクトを停滞させていた官僚主義に縛られずに自律的に作業できる小規模チームの創設を構想していました。マクニーリーはメッセージをSunの他の重要な人物に転送し、ステルスプロジェクトが始まりました。[ 45 ]
ステルスプロジェクトはすぐにグリーンプロジェクトと改名され、ジェームズ・ゴスリングとマイク・シェリダンがノートンに加わった。彼らは他のエンジニアたちと共に、カリフォルニア州メンローパークのサンドヒルロードにある小さなオフィスで作業を開始した。彼らは次世代スマート家電をプログラミングするための新しい技術の開発を目指しており、サンはこれが大きな新たな機会をもたらすと期待していた。[ 46 ]
チームは当初C++の使用を検討したが、いくつかの理由から却下した。限られたリソースで組み込みシステムを開発していたため、C++はメモリを過剰に消費し、その複雑さゆえに開発者のミスにつながると判断したのだ。また、C++にはガベージコレクション機能がないため、プログラマーはシステムメモリを手動で管理する必要があり、これは困難でエラーが発生しやすい作業だった。さらに、セキュリティ、分散プログラミング、スレッド処理といった移植性の高い機能がC++には不足している点も懸念材料だった。そして何より、あらゆる種類のデバイスに容易に移植できるプラットフォームを求めていた。
ビル・ジョイは、MesaとCを組み合わせた新しい言語を構想していた。彼は「Further」という論文で、SunのエンジニアがC++をベースにしたオブジェクト指向環境を開発すべきだと提案した。当初、ゴスリングはC++を修正・拡張しようと試みた(彼はこれを「C++ ++ --」と呼んだ)が、すぐにそれを放棄し、オフィスのすぐ外に立っていた木にちなんでオークと名付けた新しい言語の作成に取り掛かった。 [ 47 ]
1992年の夏までに、チームはGreen OS 、Oak言語、ライブラリ、ハードウェアなど、新しいプラットフォームの一部をデモンストレーションできるようになった。1992年9月3日に行われた最初のデモンストレーションでは、 Star7という名の携帯情報端末(PDA)の構築に重点が置かれた。グラフィカルインターフェースと、ユーザーを支援する「デューク」と呼ばれるスマートエージェントを備えたデバイスがありました。その年の 11 月、グリーン プロジェクトはスピンオフして、サン マイクロシステムズの完全子会社であるFirstpersonとなり、チームはカリフォルニア州パロアルトに移転しました。[ 48 ] Firstperson チームは、高度にインタラクティブなデバイスの構築に興味を持っており、タイム ワーナーがセット トップ ボックスの提案依頼書(RFP)を発行したとき、Firstperson はターゲットを変更し、セット トップ ボックス プラットフォームの提案で応じました。しかし、ケーブル業界は、そのプラットフォームがユーザーに制御権を与えすぎていると感じたため、Firstperson はSGIに入札で敗れました。セット トップ ボックスに関するThe 3DO Companyとの追加の契約も実現しませんでした。テレビ業界で関心を集めることができなかったため、同社はサンに再編されました。

1994 年 6 月と 7 月、ジョン ゲージ(サン社の科学部長)、ゴスリング、ジョイ、ノートン、ウェインローシング、エリック シュミットとの 3 日間のブレインストーミングの後、チームはワールド ワイド ウェブ向けのプラットフォームを再ターゲットにした。彼らは、 Mosaicのようなグラフィカル ウェブブラウザの登場により、インターネットはケーブル テレビで構想していたのと同じ高度にインタラクティブなメディアに進化できると考えた。プロトタイプとして、ノートンは WebRunner (映画ブレード ランナーにちなんで名付けられた) という小さなブラウザを作成し、 1995 年にHotJava [ 46 ]と改名した。
サンは商標調査の結果、 Oak TechnologyがOakという名前を使用していることが判明したため、Oak言語をJavaに改名した。[ 49 ]サンは市場シェアを獲得するためにJavaライセンスを原価以下で販売した。[ 50 ] Java 1.0aは1994年にダウンロード可能になったが、Javaの最初の公開リリースであるHotJavaブラウザ付きのJava 1.0a2は、1995年5月23日にGageがSunWorldカンファレンスで発表した。Gageの発表に伴って、Netscape Communications CorporationのエグゼクティブバイスプレジデントであるMarc Andreessenは、NetscapeブラウザにJavaサポートが含まれることを予期せず発表した。1996年1月9日、サン・マイクロシステムズはJavaSoftグループを設立し、この技術の開発に着手した。[ 51 ]
ウェブブラウザ用のいわゆるJavaアプレットは、もはやJavaの最も一般的な用途(例えば、サーバーサイドでの使用が増えている)でも、クライアントサイドでコードを実行する最も一般的な方法(JavaScriptがより一般的になった)でもありませんが、JVMサポートが終了した後でも、TeaVMなどを使用して、ウェブブラウザでJava(またはKotlinなどの他のJVM言語)を実行することは依然として可能です。
2006年11月13日、サン・マイクロシステムズはJavaの実装の大部分をGNU一般公衆ライセンス(GPL)の下で公開した。[ 52 ] [ 53 ]
Java 言語は、1996 年 1 月 23 日に JDK ( Java Development Kit ) 1.0がリリースされて以来、いくつかの変更が加えられ、標準ライブラリ に多数のクラスとパッケージが追加されてきました。J2SE 1.4以降、Java Community Process (JCP) が Java 言語の進化を管理しています。JCP はJava Specification Requests (JSR) を使用して、Java プラットフォームへの追加と変更を提案および規定します。Java Language Specification (JLS) は言語を規定し、JLS の変更は JSR 901の下で管理されます。 [ 54 ]
サン・マイクロシステムズは1997年2月19日にJDK 1.1をリリースした。主な追加機能としては、Abstract Window Toolkit(AWT)イベントモデルの大幅な改良、言語への内部クラスの追加、 JavaBeans、およびJava Database Connectivity(JDBC)などが挙げられる。
J2SE 1.2 (1998 年 12 月 8 日) – コードネームPlayground 。このバージョンと、J2SE 5.0までの以降のリリースはJava 2と改名され、ベース プラットフォームを J2EE ( Java 2 Platform, Enterprise Edition )および J2ME ( Java 2 Platform, Micro Edition) と区別するために、バージョン名が JDK から J2SE ( Java 2 Platform, Standard Edition ) に変更されました。主な追加機能には、リフレクション、コレクションフレームワーク、Java IDL ( CORBA相互運用性のためのインターフェース記述言語実装)、およびSwingグラフィカル API のコア クラスへの統合が含まれます。Javaプラグインがリリースされました (その後、Web ブラウザー ベンダーはサポートを終了し、 Java コード ベースの削除により現在は非推奨となり、2026 年の Java 26 で削除される予定です[ 55 ] )。また、Sun の JVM には初めてJIT コンパイラが搭載されました。
J2SE 1.3 (2000 年 5 月 8 日) – コードネームKestrel。注目すべき変更点としては、HotSpot JVM (HotSpot JVM は J2SE 1.2 JVM 向けに 1999 年 4 月に初めてリリースされました)、JavaSound、Java Naming and Directory Interface (JNDI)、Java Platform Debugger Architecture (JPDA) のバンドル化が挙げられます。
J2SE 1.4 (2002 年 2 月 6 日) – コードネームMerlin 。これは、JSR 59として Java Community Process の下で開発された Java プラットフォームの最初のリリースとなりました。[ 56 ]主な変更点には、 Perlをモデルにした正規表現、例外連鎖、統合XMLパーサーおよびXSLTプロセッサ ( JAXP )、Java Web Startなどがありました。
J2SE 5.0 (2004 年 9 月 30 日) – コードネームTiger。当初は 1.5 という番号が付けられており、これは現在も内部バージョン番号として使用されています。[ 57 ] JSR 176 の下で開発された Tiger では、for-each ループ、ジェネリクス、オートボクシング、var-argsなど、いくつかの重要な新しい言語機能が追加されました。[ 58 ]
Java SE 6 (2006 年 12 月 11 日) – コードネームMustang。データベースマネージャがバンドルされており、JVM でスクリプト言語 ( MozillaのRhinoエンジンを使用したJavaScriptなど) の使用を容易にします。このバージョン以降、Sun は「J2SE」という名前をJava SEに置き換え、バージョン番号から「.0」を削除しました。[ 59 ]その他の主な変更点には、プラグイン可能な注釈( JSR 269 ) のサポート、Windows Vistaの外観と操作性をサポートするためのネイティブ UI の強化を含む多くのGUI の改善、監視とトラブルシューティングを改善するためのJava Platform Debugger Architecture (JPDA) および JVM Tool Interfaceの改善などがあります。
Java SE 7 (2011 年 7 月 28 日) – コードネームDolphin。このバージョンは JSR 336の下で開発されました。 [ 60 ] switch 文での文字列、try-with-resources、汎用インスタンス作成のための型推論など、多くの小さな言語変更が追加されました。JVM は動的言語のサポートで拡張され、クラスライブラリは join/fork フレームワーク、[ 61 ]改良された新しいファイル I/O ライブラリ、 SCTPなどの新しいネットワーク プロトコルのサポートなどで拡張されました。Java 7 Update 76 は 2015 年 1 月にリリースされ、有効期限は 2015 年 4 月 14 日です。[ 62 ]
2016年6月、Java 7の最後の公開アップデート後、 [ 63 ] Java 6、7、8の「リモートから悪用可能な」セキュリティバグが発表されました。 [ 13 ]
Java SE 8 (2014 年 3 月 18 日) –コードネームKenai。注目すべき変更点としては、ラムダ式(クロージャ) とデフォルト メソッドの言語レベルのサポート、Project Nashorn JavaScript ランタイム、Joda Time に触発された新しい日付と時刻 API、および PermGen の削除などがあります。このバージョンはWindows XPプラットフォームでは公式にはサポートされていませんが[ 64 ]、動作することが知られています。そのため、Java 7 のライフサイクルの終了に伴い、XP ユーザーには推奨バージョンとなっています。以前は、Windows XP SP3 用の非公式の手動インストール方法のみが説明されていました。これは、完全に機能するJava ランタイム環境も含まれる Java の開発プラットフォームである JDK8 を参照しています。[ 65 ] Java 8 は、Windows Server 2008 R2 SP1、Windows Vista SP2、Windows 7 SP1、 Ubuntu 12.04 LTS 以降 (およびその他のいくつかの OS)でサポートされています。 [ 66 ]
Java SE 9および10 はシステム要件が高く、Windows 7 または Server 2012 が必要であり (Web ブラウザの最小認定要件はInternet Explorer 11またはその他の Web ブラウザに引き上げられています)、Oracle はすべてのプラットフォームで32 ビット互換性を廃止したため、Oracle の「 64 ビットJava 仮想マシン (JVM) のみが認定されています」。[ 67 ]
Java SE 11 LTS は 2018 年 9 月にリリースされました。これは、バージョン 9 から採用された迅速リリースモデル以来、最初のLTSリリースです。OpenJDK 11 は、初めて GNU General Public License の下で Java プラットフォームの完全なソース コードを表しています。Oracle は引き続きオプションの独自ライセンスでデュアル ライセンスしていますが、独自ライセンス バージョンに固有のコードの違いやモジュールはありません。[ 68 ] Java 11 の機能には、2 つの新しいガベージ コレクタ実装、深刻な問題をデバッグするための Flight Recorder、 WebSocketサポートを含む新しい HTTP クライアントが含まれます。[ 69 ]
Java SE 12は2019年3月にリリースされました。[ 70 ]
Java SE 13は2019年9月にリリースされました。[ 71 ]
Java SE 14は2020年3月にリリースされました。[ 72 ]
Java SE 15は2020年9月にリリースされました。
Java SE 16は2021年3月にリリースされました。
Java SE 17 LTSは2021年9月にリリースされました。
Java SE 18は2022年3月にリリースされました。
Java SE 19は2022年9月にリリースされました。
Java SE 20は2023年3月にリリースされました。
Java SE 21 LTSは2023年9月にリリースされました。
Java SE 22は2024年3月にリリースされました。
言語の変更に加えて、Java クラス ライブラリも長年にわたって大きく変更され、JDK 1.0 の数百クラスから J2SE 5.0 では 3,000 クラス以上に増えました。SwingやJava 2D などのまったく新しい API が進化し、元の JDK 1.0 のクラスやメソッドの多くが非推奨になりました(その中には、ファイナライゼーションに関連するものなど、完全に非推奨になったものもあります)。[ 73 ]
Java 22 では、少なくとも 1 つの非常にまれにしか使用されない API (スレッド用) が削除されました。[ 74 ] [ 75 ]

現在のJavaは、64ビット版Windows 10(およびServer 2016)以降、64ビット版macOS 13.x以降、および64ビット版Linux(Oracle Enterprise Linuxなど)でサポートされています。Oracleではビルドのサポートは提供されていませんが(IBM、SAPなどでは提供されている可能性があります)、AIX、Ubuntu、RHEL、Alphine/ muslなど、動作することが確認されている環境もあります。32ビット版WindowsのサポートはJava 22以降非推奨となり(32ビット版JVMはデフォルト以外のオプションを指定しないとビルドできなくなりました)。
Oracleによると、2010年にはJava Runtime Environmentが8億5000万台以上のPCに搭載されていた。[ 76 ] Microsoftは、Sun Microsystemsが、バンドルされたJavaランタイム環境にWindows固有のクラスを追加し、 Visual J++を通じて新しいクラスを利用できるようにしたとしてMicrosoftを訴えて以来、オペレーティングシステムにJava Runtime Environment(JRE)をバンドルしていない。Appleは、OS Xバージョン10.7以降、JavaランタイムをOS Xに含めなくなったが、JREを必要とするアプリケーションを初めて起動すると、システムはユーザーにダウンロードしてインストールするように促す。多くのLinuxディストリビューションは、デフォルトの仮想マシンとしてOpenJDKランタイムを含んでいるため、独自のOracle JREをダウンロードする必要がない。[ 77 ]
Javaアプリケーションの中には、NetBeans、Eclipse、JetBrains [ 78 ]などの統合開発環境や、 LimeWireやVuzeなどのファイル共有クライアントなど、デスクトップで広く使われているものがあります。Javaは、 MATLAB数学プログラミング環境でも、ユーザーインターフェースのレンダリングとコアシステムの一部として使用されています。Javaは、 Lotus Notesなどのハイエンドなコラボレーションアプリケーション向けにクロスプラットフォームのユーザーインターフェースを提供しています。
Oracleは、JDK 9でJava Runtime Environmentから個別にインストール可能なJavaブラウザプラグインをまず非推奨にし、その後将来のリリースから完全に削除し、Web開発者に代替技術の使用を強制する計画である。[ 79 ]

サン・マイクロシステムズがJava SEとJava MEをフリーソフトウェアライセンス(GNU General Public License )でリリースすると発表した際、同時にデュークのグラフィックをフリーBSDライセンスでリリースした。 [ 81 ]デュークの新しいキャラクターは毎年作られる。[ 82 ]例えば、2011年7月の「Future Tech Duke」は、鼻が大きく、ジェットパックと青い翼を装備していた。[ 83 ]
SunのJava実装(事実上のリファレンス実装)のソースコードは以前から入手可能でしたが、最近まで[ 84 ]ライセンス条項により、Sunとの契約に署名(および一般的には料金を支払う)しない限り、その使用が厳しく制限されていました。そのため、これらの条項はオープンソース・イニシアティブまたはフリーソフトウェア財団のいずれの要件も満たしておらず、オープンソースまたはフリーソフトウェアとみなされていなかったため、Sun Javaはプロプライエタリなプラットフォームでした。[ 85 ]
GNU ClasspathやApache Harmonyなど、いくつかのサードパーティプロジェクトがフリーソフトウェアによる部分的なJava実装を作成したが、Sunライブラリの規模の大きさとクリーンルーム方式の採用により、これらのプロジェクトによるJavaライブラリの実装(コンパイラとVMは比較的小さく、明確に定義されている)は不完全で、完全な互換性を欠いていた。また、これらの実装はSunの実装に比べて最適化がはるかに劣っていた。

サンはJavaOne 2006でJavaがフリーかつオープンソースのソフトウェアになると発表し[ 86 ]、2006年10月25日、Oracle OpenWorldカンファレンスで、ジョナサン・I・シュワルツは、同社が30~60日以内にコアJavaプラットフォームをフリーかつオープンソースのソフトウェアとしてリリースすることを発表する予定だと述べた[ 87 ] 。
サンは2006年11月13日にJava HotSpot仮想マシンとコンパイラをGNU一般公衆ライセンスの下でフリーソフトウェアとしてリリースし、JDKの残りの部分(JREを含む)を2007年3月までにGPLの下に置くことを約束した(「GPLの下で配布可能なソース形式で公開する権利をサンが持っていないいくつかのコンポーネントを除く」)。[ 88 ]リチャード・ストールマンによれば、これは「Javaの罠」の終焉を意味する。[ 89 ]マーク・シャトルワースは最初のプレス発表を「フリーソフトウェアコミュニティにとって真のマイルストーン」と呼んだ。[ 90 ]
サンは、2007年5月8日にクラスライブラリのソースコードをGPLライセンスで公開したが、フリーソフトウェアおよびオープンソースライセンスでコードを公開することを望まなかった第三者からサンがライセンスを取得した一部の限定的な部分は除外した。[ 91 ]制約を受けた部分の中には、フォントレンダリングや2Dラスタライズなど、プラットフォームのかなり重要な部分が含まれていたが、これらは後にサンによってオープンソースとして公開された(OpenJDKクラスライブラリを参照)。
Sunの目標は、独自仕様でクローズドソースのまま残っている部分を代替実装に置き換え、クラスライブラリを完全にフリーでオープンソースにすることだった。その間、IcedTeaと呼ばれるサードパーティプロジェクトが、制約のあるコードをスタブまたはGNU Classpathのコードに置き換えることで、完全にフリーで非常に使いやすいJDKを作成した。しかし、OpenJDKはその後、制約のある部分なしでビルドできるようになり(OpenJDK 6 b10 [ 92 ]以降)、ほとんどのLinuxディストリビューションのデフォルトのランタイム環境となった。[ 93 ] [ 94 ] [ 95 ] [ 96 ]
2008年6月、IcedTea 6( Fedora 9上のOpenJDKのパッケージ版として)がテクノロジー互換性キットのテストに合格し、Java 6と完全に互換性のある実装であると主張できると発表されました 。[ 97 ]
OpenJDKはGPLの下にあるため、エンドユーザー(またはそのシステム管理者)が各システムに独自のOracle JREの正しいバージョンをダウンロードしてインストールする必要はなく、ソフトウェアアプリケーションとともにカスタムバージョンのJREを直接再配布することが可能です[ 98 ] [ 99 ]。
ほとんどの場合、Web ブラウザで Java のサポートは不要であり、セキュリティ専門家は、絶対に必要な場合を除き、ブラウザで実行しないことを推奨しています。[ 100 ]一部の Web サイトが Java を必要とする場合は、ユーザーはそれらのサイト専用の別のブラウザをインストールする必要があると提案されました。
Java 5.0 にジェネリクスが追加されたとき 、既に大規模なクラスのフレームワークが存在していたため (その多くは既に非推奨になっていた)、移行互換性とこれらの既存クラスの再利用を可能にするために、ジェネリクスは型消去を使用して実装されることが選択された。これにより、この追加によって提供できる機能は、他のいくつかの言語と比較して制限された。[ 101 ] [ 102 ]型ワイルドカードの追加により、Java は健全ではなくなった。[ 103 ]
Javaにはネイティブの符号なし整数型がありません。符号なしデータはC言語で書かれたプログラムから生成されることが多く、これらの型がないためにC言語とJavaの間で直接データを交換できません。符号なしの大きな数値は暗号化を含む多くの数値処理分野でも使用されるため、Javaをこれらのタスクに使用するのは不便です。[ 104 ] 変換コードとより大きなデータ型を使用することでこの問題を部分的に回避することは可能ですが、Javaで符号なしデータを扱うのは面倒になります。32ビットの符号付き整数は16ビットの符号なし値を比較的簡単に保持できますが、32ビットの符号なし値には64ビットの符号付き整数が必要です。さらに、 Java言語には64ビットより大きい型が存在しないため、Javaのどの整数型を使用しても64ビットの符号なし値を格納できません。関数を使用して抽象化すると、他の言語ではネイティブな多くの操作で関数呼び出しが必要になります。あるいは、Javaの符号付き整数を使用して同じサイズの符号なし整数をエミュレートすることも可能ですが、これには複雑なビット演算に関する詳細な知識が必要です。[ 105 ]
Java の浮動小数点演算は、大部分がIEEE 754 (バイナリ浮動小数点演算の標準)に基づいているが、strictfp例外フラグや指向丸めなど、 IEEE 標準 754 で義務付けられている機能など、修飾子を使用してもサポートされない特定の機能がある。さらに、754 で許可され、多くのプロセッサに存在する拡張精度浮動小数点型は、Java では許可されていない。[ 106 ] [ 107 ]
Javaの初期( 2000年にJava 1.3でHotSpot VMが実装される前)には、パフォーマンスに関する批判がいくつかありました。ベンチマークでは、JavaはC(ネイティブコードにコンパイルされる言語)よりも約50%遅いと報告されることが一般的でした。[ 108 ] [ 109 ] [ 110 ]
Javaのパフォーマンスは初期バージョンから大幅に向上しました。[ 23 ]いくつかの最適化されたテストでは、 JITコンパイラのパフォーマンスはネイティブコンパイラと比較して非常に似ていることが示されています。[ 23 ] [ 24 ] [ 25 ]
Javaバイトコードは、仮想マシンによって実行時に解釈されるか、ロード時または実行時にコンパイルされてコンピュータのハードウェア上で直接実行されるネイティブコードに変換されます。解釈はネイティブ実行よりも遅く、ロード時または実行時のコンパイルにはコンパイルによる初期パフォーマンスの低下があります。最新の高性能JVM実装はすべてコンパイル方式を採用しているため、初期起動時間を過ぎるとパフォーマンスはネイティブコードと同等になります。
Javaプラットフォームは、悪意のあるソフトウェアや不適切に記述されたソフトウェアから保護するために、ユーザーが信頼できないバイトコードを「サンドボックス」内で実行できるように設計されたセキュリティアーキテクチャ[ 111 ]を提供します。この「サンドボックス」機能は、ローカルファイルシステムへのアクセス、任意のコマンドの実行、通信ネットワークへのアクセスなど、マルウェアによって悪用される可能性のある特定のプラットフォーム機能やAPIへのアクセスを制限することによって、ユーザーを保護することを目的としています。
近年、研究者たちは、OracleのJava実装を含む、広く利用されているJava実装の一部に多数のセキュリティ上の欠陥を発見しました。これらの欠陥により、信頼できないコードがサンドボックス機構を回避し、ユーザーが悪意のある攻撃にさらされる可能性があります。これらの欠陥は、公開WebサイトからダウンロードしたJavaアプレットを実行するWebブラウザプラグインなど、任意の信頼できないバイトコードを実行するJavaアプリケーションのみに影響します。ユーザーが実行されるすべてのコードを信頼し、完全に制御できるアプリケーションは影響を受けません。
2012年8月31日、Microsoft Windows、 OS X、Linux上のJava 6と7(当時両方ともサポートされていた)に、悪意のあるWebページを読み込むだけでリモート攻撃が可能になる深刻なセキュリティ上の欠陥が発見された。 [ 112 ]その後、 Java 5にも同様の欠陥があることが判明した。[ 113 ]
2013 年 1 月 10 日、3 人のコンピュータ専門家が Java に反対し、ロイター通信に対し、Java は安全ではないため、Java を無効にするべきだと述べた。AlienVault Labs のラボ マネージャーである Jaime Blasco 氏は、「Java はひどい。安全ではない。無効にしなければならない」と述べた。[ 114 ] この脆弱性はJava 7に影響し、 Java 6に影響するかどうかは不明であるため、消費者は Java を無効にすることを推奨する。[ 115 ] [ 116 ] Oracle のセキュリティ アラートでは、Java の重要なセキュリティ関連のパッチのスケジュールが発表されている。[ 117 ]
2013年1月14日、セキュリティ専門家は、アップデート後もPCを攻撃から保護できていないと述べた。[ 118 ]この脆弱性により、米国国土安全保障省はJavaを無効化またはアンインストールするようユーザーに促す対応を取った。[ 14 ] Appleは、ウイルス対策プログラムを通じて、 OS Xオペレーティングシステムを実行しているすべてのコンピュータでJavaを限定的にブラックリストに登録した。[ 119 ]
2014年、当時最新のJavaのセキュリティと脆弱性の問題に対応して、セキュリティブロガーのBrian Krebsは、少なくともJavaブラウザプラグインとソフトウェア全体を削除するようユーザーに呼びかけました。「Javaプラグインのない世界(そして読者に四半期ごとのパッチ更新を思い出させる必要がない世界)を楽しみにしていますが、このプラグインのさまざまなバージョンが世界中のエンドユーザーシステムからほぼ完全に削除されるまでには、おそらく何年もかかるでしょう。」[ 120 ]「かつては有望だったものの、ブラウザでの有用性は失われ、コンピュータユーザーを犠牲にしてサイバー犯罪者を喜ばせる悪夢になってしまいました。」[ 121 ]「すべてのPCとMacからJavaをアンインストールし、再度追加する必要があるかどうかを慎重に検討すべきだと思います。一般的な家庭ユーザーであれば、おそらくなくても問題ありません。ビジネスユーザーであれば、選択の余地がないかもしれません。」[ 122 ]
Oracle が配布する Java ランタイム環境は、インストール時や毎月のようにリリースされるアップデート時に、スポンサー付きソフトウェアをデフォルトでバンドルしてインストールする傾向があります。これには、ブラウザの検索を広告にリダイレクトする「 Ask.com ツールバー」や「McAfee Security Scan Plus」などが含まれます。 [ 123 ]これらのオファーは、Java コントロール パネルの設定でブロックできますが、その方法は分かりにくいです。この設定は、Java コントロール パネルの「詳細設定」タブの「その他」の見出しの下にあり、「スポンサー オファーを抑制する」オプションとして表示されています。
Javaは、Google Chrome [ 125 ]やFlash Player [ 126 ]とは異なり、ユーザーの介入や管理者権限を必要としない自動更新機能をまだリリースしていません[ 124 ] 。
{{cite web}}: CS1 maint: タイトルとしてアーカイブされたコピー (リンク){{cite web}}: CS1 maint: タイトルとしてアーカイブされたコピー (リンク)「弁護士から『OAK』という名前はオーク・テクノロジーズ社が既に商標登録しているため使用できないと言われました」と、サン・マイクロシステムズの上級エンジニアであるフランク・イェリン氏は語った。「そこで、新しい名前のアイデアを出し合うためのブレインストーミング会議が開かれました。」
「これは当社の原価を下回る価格設定です」とシュミット氏は言う。「このライセンス事業は当面の間赤字になりますが、市場シェア獲得のための戦略的な投資なのです。」
モードのみがサポートされています。Waylandモード
は
サポートされていません。
は世界中で8億5000万台以上のパーソナルコンピュータと、モバイル機器やテレビ機器を含む数十億台のデバイスで動作しています。