JVMとは何ですか?Java仮想マシンの紹介

Java仮想マシンは、他のプログラムを実行することを目的としたプログラムです。これは単純なアイデアであり、カンフーのコーディングの最大の例の1つでもあります。JVMは当時の現状を混乱させ、今日もプログラミングの革新をサポートし続けています。

JVMの用途

JVMには2つの主要な機能があります。Javaプログラムを任意のデバイスまたはオペレーティングシステムで実行できるようにすること(「1回書き込み、どこでも実行」の原則として知られています)と、プログラムメモリの管理と最適化です。Javaが1995年にリリースされたとき、すべてのコンピュータプログラムは特定のオペレーティングシステムに書き込まれ、プログラムメモリはソフトウェア開発者によって管理されていました。したがって、JVMは啓示でした。

JavaWorld /

JVMの技術的な定義があると便利です。また、ソフトウェア開発者がそれについて考える日常的な方法もあります。それらを分解しましょう:

  • 技術的な定義:JVMは、コードを実行し、そのコードのランタイム環境を提供するソフトウェアプログラムの仕様です。
  • 日常の定義:JVMは、Javaプログラムを実行する方法です。JVMの設定を構成し、実行中にプログラムリソースを管理するためにJVMに依存します。

開発者がJVMについて話すとき、私たちは通常、Javaアプリのリソース使用量を表し、制御するマシン、特にサーバーで実行されているプロセスを意味します。これを、これらのタスクを実行するプログラムを構築するための要件を説明しているJVM仕様と比較してください。

誰がJVMを開発および保守しますか?

JVMは、企業とオープンソースの両方の非常に優秀なプログラマーによって広く展開され、頻繁に使用され、保守されています。OpenJDKプロジェクトは、Javaをオープンソース化するというSunMicrosystemsの決定の子孫です。OpenJDKは、オラクルのJavaのスチュワードシップを通じて継続しており、最近ではオラクルのエンジニアが多くの重労働を行っています。

JVMでのメモリ管理

実行中のJVMとの最も一般的な相互作用は、ヒープとスタックのメモリ使用量を確認することです。最も一般的な調整は、JVMのメモリ設定の調整です。

ガベージコレクション

Java以前は、すべてのプログラムメモリはプログラマによって管理されていました。Javaでは、プログラムメモリはJVMによって管理されます。JVMは、Javaプログラムで未使用のメモリを継続的に識別して排除するガベージコレクションと呼ばれるプロセスを通じてメモリを管理します。ガベージコレクションは、実行中のJVM内で行われます。

初期の頃、Javaは、C ++ほど「金属に近い」わけではなく、したがってそれほど高速ではないという多くの批判を受けていました。ガベージコレクションプロセスは特に物議を醸しました。それ以来、さまざまなアルゴリズムとアプローチが提案され、ガベージコレクションに使用されてきました。一貫した開発と最適化により、ガベージコレクションは大幅に改善されました。

「金属に近い」とはどういう意味ですか?

プログラマーがプログラミング言語またはプラットフォームが「金属に近い」と言うとき、開発者がプロ​​グラムで(コードを書くことによって)オペレーティングシステムのメモリを管理できることを意味します。理論的には、プログラマーは、使用量と廃棄時期を指定することで、プログラムのパフォーマンスを向上させることができます。ほとんどの場合、メモリ管理をJVMのような高度に洗練されたプロセスに委任すると、自分で行うよりもパフォーマンスが向上し、エラーが少なくなります。

3つの部分からなるJVM

JVMには、仕様、実装、インスタンスの3つの側面があると言えます。これらのそれぞれについて考えてみましょう。

1.JVM仕様

まず、JVMはソフトウェア仕様です。やや循環的な方法で、JVM仕様は、その実現において最大の創造性を可能にするために、その実装の詳細が仕様内で定義されていないことを強調しています。

「Java仮想マシンを正しく実装するには、classファイル形式を読み取り、そこで指定された操作を正しく実行するだけで済みます。」

JSバッハはかつて同様に音楽を作ることを説明しました:

「あなたがしなければならないのは、適切なタイミングで適切なキーに触れることだけです。」

したがって、JVMが行う必要があるのは、Javaプログラムを正しく実行することだけです。単純に聞こえますが、外部からは単純に見えるかもしれませんが、特にJava言語の能力と柔軟性を考えると、これは大規模な作業です。

仮想マシンとしてのJVM

JVMは、Javaクラスファイルを移植可能な方法で実行する仮想マシンです。仮想マシンであるということは、JVMが、プログラムが実行されているサーバーなど、基盤となる実際のマシンを抽象化したものであることを意味します。実際に存在するオペレーティングシステムまたはハードウェアに関係なく、JVMはプログラムを実行するための予測可能な環境を作成します。ただし、実際の仮想マシンとは異なり、JVMは仮想オペレーティングシステムを作成しません。JVMをマネージドランタイム環境またはプロセス仮想マシンとして説明する方が正確です。

2.JVMの実装

JVM仕様を実装すると、JVM実装である実際のソフトウェアプログラムが作成されます。実際、オープンソースとプロプライエタリの両方で、多くのJVM実装があります。OpenJDKのHotSpotJVMはリファレンス実装であり、世界で最も徹底的に試行錯誤されたコードベースの1つです。HotSpotは、最も一般的に使用されるJVMでもあります。

OracleのライセンスJDKを含め、ほとんどすべてのライセンスJVMは、OpenJDKおよびHotSpotJVMからのフォークとして作成されます。OpenJDKからライセンスフォークを作成する開発者は、OS固有のパフォーマンスの改善を追加したいという願望に動機付けられることがよくあります。通常、JVMをJavaランタイム環境(JRE)のバンドル部分としてダウンロードしてインストールします。

3.JVMインスタンス

JVM仕様がソフトウェア製品として実装およびリリースされた後、プログラムとしてダウンロードして実行できます。ダウンロードされたプログラムは、JVMのインスタンス(またはインスタンス化されたバージョン)です。

ほとんどの場合、開発者が「JVM」について話すとき、私たちはソフトウェア開発または実稼働環境で実行されているJVMインスタンスを指します。「ねえアナンド、そのサーバー上のJVMはどのくらいのメモリを使用していますか?」と言うかもしれません。または、「循環呼び出しを作成し、スタックオーバーフローエラーがJVMをクラッシュさせたとは信じられません。初心者の間違いです!」

ソフトウェア仕様とは何ですか?

ソフトウェアの仕様は、(あるいは仕様)ソフトウェアシステムが動作する方法を説明し、人間が読み取り可能な設計文書です。仕様の目的は、エンジニアがコーディングするための明確な説明と要件を作成することです。

JVMでのクラスファイルのロードと実行

Javaアプリケーションの実行におけるJVMの役割について説明しましたが、JVMはどのようにその機能を実行しますか?Javaアプリケーションを実行するために、JVMはJavaクラスローダーとJava実行エンジンに依存しています。

JVMのJavaクラスローダー

Javaのすべてはクラスであり、すべてのJavaアプリケーションはクラスから構築されます。アプリケーションは、1つのクラスまたは数千のクラスで構成できます。Javaアプリケーションを実行するには、JVMはコンパイルされた.classファイルをサーバーなどのコンテキストにロードしてアクセスできるようにする必要があります。JVMは、この機能を実行するためにクラスローダーに依存しています。

Javaクラスローダーは、クラスをメモリにロードして実行できるようにするJVMの一部です。クラスローダーは、遅延読み込みやキャッシュなどの手法を使用して、クラスの読み込みを可能な限り効率的にします。とは言うものの、クラスのロードは、(たとえば)ポータブルランタイムメモリ管理のような壮大な頭の体操ではないため、テクニックは比較的単純です。

すべてのJava仮想マシンには、クラスローダーが含まれています。JVM仕様では、実行時にクラスローダーをクエリおよび操作するための標準的な方法が説明されていますが、JVM実装はこれらの機能を実行する責任があります。開発者の観点からは、基盤となるクラスローダーメカニズムは通常ブラックボックスです。

JVMの実行エンジン

クラスローダーがクラスのロード作業を完了すると、JVMは各クラスのコードの実行を開始します。実行エンジンは、この機能を処理するJVMコンポーネントです。実行エンジンは、JVMの実行に不可欠です。実際、すべての実用的な目的のために、それはJVMインスタンスです。

コードの実行には、システムリソースへのアクセスの管理が含まれます。JVM実行エンジンは、実行中のプログラム(ファイル、ネットワーク、およびメモリのリソースを必要とする)と、それらのリソースを提供するオペレーティングシステムの間にあります。

実行エンジンがシステムリソースを管理する方法

システムリソースは、メモリとその他すべての2つの大きなカテゴリに分類できます。

JVMは未使用のメモリの処理を担当し、ガベージコレクションはその処理を行うメカニズムであることを思い出してください。JVMは、開発者が当然と考える参照構造の割り当てと維持も担当します。例として、JVMの実行エンジンはnew、Javaのキーワードのようなものを取得し、それをOS固有のメモリ割り当て要求に変換する役割を果たします。

実行エンジンは、メモリ以外に、ファイルシステムアクセスとネットワークI / Oのリソースを管理します。JVMはオペレーティングシステム間で相互運用可能であるため、これは意味のある作業ではありません。各アプリケーションのリソースニーズに加えて、実行エンジンは各OS環境に応答する必要があります。これが、JVMが実際の要求を処理できる方法です。

JVMの進化:過去、現在、未来

1995年、JVMは2つの革新的な概念を導入しました。それ以来、現代のソフトウェア開発の標準的な運賃となっています。「一度書けば、どこでも実行できる」と自動メモリ管理です。当時、ソフトウェアの相互運用性は大胆な概念でしたが、今日、それについて2度考えている開発者はほとんどいません。同様に、私たちのエンジニアリングの先駆者はプログラムのメモリを自分で管理する必要がありましたが、私の世代はガベージコレクションで育ちました。

ジェームズ・ゴスリングとブレンダン・アイクが現代のプログラミングを発明したと言えますが、他の何千人もの人々がその後の数十年にわたって彼らのアイデアを洗練し、構築してきました。Java仮想マシンは元々Java専用でしたが、今日では、Scala、Groovy、Kotlinなどの多くのスクリプト言語とプログラミング言語をサポートするように進化しています。将来的には、JVMが開発ランドスケープの重要な部分ではない未来を見るのは難しいです。

JVMに関するすべて

  • Javaチャレンジャー:JVMでのスレッドの動作
  • Javaチャレンジャー:JVMでのメソッドのオーバーロード
  • JVM内部パフォーマンスの最適化
  • バイトコードの基本:JVMがバイトコードを処理する方法
  • Java例外:JVMが例外を処理する方法
  • 無駄のない、平均的なJava仮想マシンの紹介

このストーリー「JVMとは?Java仮想マシンの紹介」は、もともとJavaWorldによって公開されました。