JavaといえばObject-Oriented Launguageですよね。
その他、何か特徴を説明できるでしょうか?
Javeの開発で使っているJDKやJREの違い、説明できますか?
何気なく普段使っていても役割がいまいち分かっていない方もいるのではないでしょうか。
ここで初見の人も、中級者の人も一度おさらいしておきましょう。
忘れたらまた思い出して、スラスラっとJob Interviewなどで答えられるように普段から準備しておきましょう。

余裕のあるエンジニアになりたい!
JRE、JDK、JVMの役割
さて、JRE、JDK、JVMとはそれぞれなんでしょうか?

JREとはJava Runtime Environmentの略で、その名からも想像がつくようにJava Applicationを動かす環境を提供してくれます。JVMやその他のライブラリを内包しています。
JVMはJava Virtual Machineの略で、Javaコード(バイトコード)を機械が解読可能なコードに変換してくれます。変換は主にJIT(Just-in-Time) Compilerがしてくれます。
JDKはJava Development Kitの略で上記JREやJVM、コンパイラーなどを全部一つにまとめたものです。これさえ導入してしまえば、Javaの開発や実行が可能になります。
JVMはOSなどプラットフォームに依存していますが、Javaは依存せずにどんなマシーン上でも動きます。これについては以下で解説します。
Javaはコンパイラ型とインタープリタ型

機械は0と1の世界です。そんな機械語にソースコードを変換する必要があるのですが、その方法にコンパイラ型とインタープリタ型があります。違いは、一度に全部のコードを変換するか(コンパイラ型)、実行時に逐一変換するか(インタープリタ型)です。
Javaはコンパイラ型でもあり、インタープリタ型でもあります。
どういうことかというと、Java以外の場合は(上図の右側のように)、開発者が書いたソースコードが一度に機械語にコンパイルまたは逐一変換されます。
しかし、Javaの場合は(上図の左側のように)、実行前にコンパイルすることによって、一度バイトコードというファイルが作成されます。

このバイトコードのファイルがクラス拡張子(.class)で作成されるものか。
その後に、JVM上でJIT Compilerによって逐一実行されたコードが機械言語に変換されて実行されるという流れです。
なので、JVMだけプラットフォームに合わせたものをインストールしておけば、どんなマシーン上でも動くので、Javaはプラットフォームに依存しないということです。
JVMの仕組み
バイトコードのクラスファイルはJVM内でJIT Compilerくんが機械語に変換してくれるとお話ししました。では、もう少し具体的に見てみましょう。
JVMの構成図を書けますでしょうか?
JVMのメモリについて、どこになにが記録されるか、答えられるでしょうか?
普段書いているStatic変数やローカル変数はどこのメモリに記録されるでしょうか?

まず、バイトコードのクラスファイルはClass Loaderによって、メモリのMethod Areaと呼ばれるところに記録されます。Static変数やクラス、メソッドなどが各スレッド共通で使用するメモリとして「最初に」格納されるわけです。
そして、処理中に作成されたオブジェクトはHeapの中に、これも各スレッド共通メモリとして格納されます。
Stackメモリには各スレッド固有のRun-Time Stackが作成されます。ここにはローカル変数などスレッド固有の一時的な情報が格納され、スレッドが終了するころには破棄されます。

Garbage Collectorが良いように破棄してくれるのね(^^)
PC Registersは各スレッド固有のプログラムカウンタ(レジスタ)が作成されます。それぞれのスレッド固有の実行命令内容を記憶するところになります。
Native Method StacksはC言語のNativeメソッド処理に関する情報を記憶する場所になり、スレッド固有のStackメモリが作成されます。
最後に
簡単にですが、Javaの構成まとめは以上になります。転職活動中に面接対策していて、結構忘れてたので今回まとめてみました。
ぜひ、また忘れた頃に何度も復習して体に染み込ませましょう。
「Static処理は一番最初に実行される」など暗記から入る方もいると思いますが、構成を知った上でコーディングするとすんなり理解ができるかと思います。
参考文献
