第6章. JVM上でのコード実行
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
JVM が提供する2つの主要なサービスは、メモリ管理とアプリケーション・コード実行のための使いやすいコンテナである。ガベージ・コレクションについては第4章と第5章で少し詳しく説明したが、この章ではコード実行について説明する。
注
通常VM仕様と呼ばれるJava仮想マシン仕様は、適合するJava実装がどのように振る舞う必要があるかを記述していることを思い出してほしい。
仮想マシン仕様では、Javaバイトコードの実行をインタプリタ( )の観点から定義している。 しかし、大まかに言って、インタプリタ環境は、マシン・コードを直接実行するプログラミング環境と比較して、パフォーマンスが劣る。 本番グレードの最新Java環境のほとんどは、動的コンパイル機能を提供することで、この問題を解決している。
章で説明したように、この能力は別名ジャスト・イン・タイム・コンパイル( JITコンパイル)とも呼ばれる。 JVMがどのメソッドが実行されているかを追跡し、個々のメソッドが直接実行可能なコードにコンパイルする資格があるかどうかを判断するメカニズムである。
この章では、まず今日一般的に行われているJavaアプリケーションの基本的なライフサイクルを説明し、次にバイトコード解釈の概要と、HotSpotが他のインタプリタと異なる理由を説明する。
次に、JITコンパイルとプロファイルガイド付き最適化の基本概念について説明する。 コードキャッシュについて説明し、HotSpotのコンパイルサブシステムの基本を紹介する。
この章の終わりでは、Javaプログラムの実行をどのように扱うべきかを再考することで、Javaプラットフォームにおける最近の変化について述べる。 このような開発は、クラウドにデプロイされるアプリケーションへの移行と、この新しいデプロイ環境の懸念に対処する必要性によって、主に促されてきた。
従来のJavaアプリケーションのライフサイクル
Unix系システム(LinuxやMacなど)でjava HelloWorld と入力すると実際に何が起こるのか、もう少し深く潜ってみることから始めよう。Windowsでも同様のことが言える。
低レベルでは、単一プロセスであるJVMをセットアップするために、標準的なプロセス実行が行われる。 シェルはJVMバイナリを探し(例えば、おそらく$JAVA_HOME/bin/java )、引数(エントリポイント・クラス名を含む)を渡して、そのバイナリに対応するプロセスを開始する。
新しく開始されたプロセスは、コマンドライン・フラグを分析し、フラグ(ヒープサイズ、GCなど)によってカスタマイズされる仮想マシンの初期化の準備をする。 このとき、プロセスは実行中のマシンをプローブし、マシンのCPUコア数、メモリ量、CPU命令の正確なセットなど、さまざまなシステム・パラメータを調べる。
この非常に詳細な情報は、JVMがそれ自身をどのように構成するかをカスタマイズし、最適化するために使用される。 例えば、JVMはコア数を使用して、ガベージ・コレクションが実行されるときに使用するスレッド数を決定し、スレッドの共通プールのサイズを決定する。
チップ
JVMの自動プロービングと自己コンフィギュレーションの振る舞いは、Javaアプリケーションがコンテナ内でどのように振る舞うかに影響するため、認識しておくことが重要である。これについては ...
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