(0)目次&概説
(1) 記事の目的
(1-1) 目的
(2) Javaのアーキテクチャ概要・概観
(2-1) プログラムのコンパイル~実行の流れ
(2-2) Javaアーキテクチャの特徴
(2-2-1) プラットフォームに依存しない
(2-2-2) 他言語でプラットフォーム依存する例
(2-3) JDK・JRE・JVMについて
(2-3-1) JVMとは
(2-3-2) JREとは
(2-3-3) JDKとは
(3) JVMのアーキテクチャ概要
(3-1) JVMの概観
(3-2) JVMの主要サブシステム1:Class Loader
(3-3) JVMの主要サブシステム2:Runtime Data Area
(3-3-1) Method Area(メソッド領域)
(3-3-2) Heap Area(ヒープ領域)
(3-3-3) Stack Area(スタック領域)
(3-3-4) Native Stack(ネイティブスタック)
(3-3-5) Program Counter Register(PCレジスター)
(3-4) JVMの主要サブシステム3:Execution Engine
(3-4-1) JIT Compiler(JITコンパイラ)
(3-4-2) Garbage Collector(ガーベジコレクタ)
(1) 記事の目的
(1-1) 目的
Javaのアーキテクチャの概要レベルを抑える・イメージが湧くことを目標に記述しています。
(2) Javaのアーキテクチャ概要・概観
(2-1) プログラムのコンパイル~実行の流れ
Javaのプログラムが実行されるまでの過程は、ざっくり下記のような流れになっています。ポイントはJavaの特徴でもある「中間言語」へのコンパイルです。
①バイトコードに変換 [コンパイル時]
「ソースコード(Java)」を「コンパイラ」を用いて「バイトコード(中間言語)」に変換します。バイトコードはJVMのコードで、JVMが解釈可能な形式になっています。
②機械語に変換 [実行時]
「バイトコード(中間言語)」は「JVM」によって「機械語」に変換します。
③JVMによる実行 [実行時]
機械語に変換されたコードはJVMの実行環境にて実行されます。
(図211)プログラム実行の流れ
(2-2) Javaアーキテクチャの特徴
上記のフローの中で特徴的な部分としては、やはり「ソースコード」が「バイトコード(中間言語)」にコンパイルされる所だと思います。この特徴を生かして、後述の「どのプラットフォームでも動作する」というJavaの強みを生み出しています。
(2-2-1) プラットフォームに依存しない
Javaの有名な言葉で”Write Once Run Anywhere”(一度Javaでプログラムを書けば、どんなプラットフォームでも動作する)がありますが、それを実現しているのがJVMです。JVMがあれば、例えOSがWindowsだろうとLinuxだろうと動作する事ができます。
プラットフォームに依存しない理由はJVMによって「Javaプラットフォーム」を仮想的に作っており、OS等の基盤の差異を吸収しているためです。
ですのでJVMが動作さえすれば、Javaの中間言語であるバイトコード(.class)ファイルを作成する事で、JVMがそれを解釈してプラットフォームに合わせた機械語に変換してくれます。
(2-2-2) 他言語でプラットフォーム依存する例
それに対してCやC++はコンパイル済みの実行可能なバイナリファイルを特定のプラットフォームに対してリンクさせるため、基盤やOSに依存します(特定のプロセッサでの処理を意識した機械語に翻訳されているため)
(2-3) JDK・JRE・JVMについて
Javaのアーキテクチャを理解する上で、JDK・JRE・JVMの関係性を抑える事が必要と考えます。3っ社の関係性を図で表現すると次のようになります。
(図231)JDK,JRE,JVMの関係性
(2-3-1) JVMとは
JVMは「Java Virtual Machine」の略でJavaのバイトコードを解釈・実行する、JREのエンジン(心臓)であり、プログラム実行する際のmain文のコール等をしています。
VMという言葉からVMwareのような仮想OSをイメージしがちですが、実際はOS等を提供する訳ではなく、どちらかというと「Javaの仮想的な実行環境」という表現が近いかも知れません。
ビジネス観点で見ると、JVMにはOSSから独自製品まで色々な組織による幅広い種類が展開されています。例えば「HotSpot」(Oracle)や「Azul Zing」(Azul Systems)など目的に応じて選択する事ができます。
(2-3-2) JREとは
Javaの「実行環境」です。コンパイルしたJavaプログラムを必要なライブラリと結合し、JVMを起動して実行します。そのため、JREにはJVMやJavaのクラスライブラリやjavaコマンドやその他インフラ等を含んでいます。ただし、あくまで実行のための環境なので、プログラムの開発には利用できません。
(2-3-3) JDKとは
Javaの「開発用キット」です。上記のJREに加えて、コンパイラ(javac)、インタープリタ(java)や各種ツール(javadocやjdb=デバッガ)、アーカイバ(jar)なども付属しており、プログラムの開発やコンパイルが可能になります。
(備考)
通常、Javaのプログラムを実行するのみであればJREのみのインストールで良いのですが、場合によっては開発をしないケースでもJDKのインストールが必要となる場合があります。例えば、JSP等を含むWebアプリをサーバにデプロイする場合はJDKが必要となります。その理由はJSPは実行時にサーブレットにされ、そのサーブレット(Javaプログラム)をコンパイルするのにJDKが必要となるためです。
(3) JVMのアーキテクチャ概要
長くなったので、こちら(JVMのアーキテクチャ概要)の記事にて記載。