第2章 JVMの概要 JVMの概要
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
Javaが地球上で最も大きな技術プラットフォームの1つであり、およそ900万~1000万人の開発者を誇っていることは間違いない(Oracleによると)。デザインファーストの開発では、多くの開発者は自分が扱うプラットフォームの低レベルの複雑な仕組みについて知る必要はない。。そのため、開発者がこうした側面に出会うのは、顧客から初めてパフォーマンスについてクレームが来たときだけという状況になる。
しかし、パフォーマンスに関心のある開発者にとっては、JVM技術スタックの基本を理解することが重要である。JVMテクノロジーを理解することで、開発者はより良いソフトウェアを書くことができ、パフォーマンス関連の問題を調査するのに必要な理論的背景を得ることができる。
この章では、JVMがJavaをどのように実行するかを紹介し、本書の後半でこれらのトピックをより深く探求するための基礎を提供する。特に、第9章ではバイトコードを深く扱っている。読者の戦略の1つは、今この章を読み、他のトピックがある程度理解できたら、第9章と合わせて再読することである。
インタプリタとクラスローディング
Java仮想マシンを定義する仕様(通常はVM仕様と呼ばれる)によると、JVMはスタックベースのインタプリタ・マシンである。 これは、(物理的なハードウェアCPUのような)レジスタを持つのではなく、部分的な結果の実行スタックを使用し、そのスタックの一番上の値(or値)を操作することによって計算を実行することを意味する。
JVMインタプリタの基本的な振る舞いは、本質的に「while ループの中のswitch 」と考えることができる。つまり、プログラムの各オペコードを最後のループから独立して処理し、評価スタックを使って中間値を保持する。
注
Oracle/OpenJDKの仮想マシン(HotSpot)の内部を掘り下げるとわかるように、実際のプロダクション・グレードのJavaインタプリタの状況はもっと複雑になる可能性があるが、switch-inside-whileは今のところ許容できるメンタル・モデルである。
java HelloWorld コマンドを使ってアプリケーションを起動すると、オペレーティング・システムは仮想マシン・プロセス(java バイナリ)を起動する。これによりJava仮想環境がセットアップされ、HelloWorldクラス・ファイル内のユーザ・コードを実際に実行するスタック・マシンが初期化される。
アプリケーションへのエントリ点は、HelloWorld.classの main() メソッドとなる。このクラスに制御を渡すためには、実行を開始する前に仮想マシンによってロードされなければならない。
これを実現するために、Javaのクラスローディング・メカニズムが使われる。 新しいJavaプロセスが初期化されるとき、クラスローダーのチェーンが使用される。初期化ローダーは、Bootstrapクラスローダーとして知られており、コアJavaランタイムのクラスを含んでいる。 バージョン8までのJavaでは、これらはrt.jarからロードされる。バージョン9以降では、ランタイムはモジュール化され、クラスローディングの概念は多少異なっている。
Bootstrapクラスローダーの主な点は、他のクラスローダーがシステムの残りの部分を立ち上げることができるように、最小限のクラスセット( ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access