[Basic-Java] 01. JVMとは、javaコードの実行方法
5449 ワード
n/a.ターゲット
Javaソースファイル(.java)がJVMとして実行される手順について
1.JVMとは
JVMはjavaバイトコードを実行するための仮想マシンです.すなわち、JavaバイトコードはJVM上でのみ実行されるため、CPUやオペレーティングシステムに依存しない.
(ただし、JVM自体はオペレーティングシステムに依存するため、オペレーティングシステムに従ってインストールする必要があります.)
次の図はJVMアーキテクチャ図を示しています.
ソース:https://dzone.com/articles/jvm-architecture-explained
上の図に示すように、JVMは3つの主要なサブシステムから構成される.
1. ClassLoader
2. Runtime Data Area
3. Execution Engine
ClassLoaderでは、1)Loading 2)Linking 3)初期化
3段階.
手順の簡単な説明:1)Loadingフェーズ.classクラスファイルの場所を検索し、JVM上に配置します.2)リンクフェーズでは、バイトコード検証器がバイトコードが正しいかどうかを検証し、すべての静的変数にメモリを割り当てます.3)初期化段階では,すべての静的変数が前のステップで割り当てられたメモリ領域に実際に割り当てられる.
Runtime Data Areaは、5つの主要コンポーネントから構成されています.
メソッド領域
クラス・ローダが読み出したすべてのクラス・レベル(クラス情報)のデータは、
Heap領域
참고: Method, Heap 영역은 하나만 존재하고 다중 Thread들이 해당영역의 자원을 공유하기 때문에 여기에 저장된 데이터는 thread-safe하지 않습니다.
スタック領域
참고: Stack영역은 공유리소스가 아니기때문에 thread-safe합니다.
この絵は理解を助けるためだ.各ThreadはStackを作成し、各メソッド呼び出しはStackフレームを作成します.
PC Registers
各Threadには個別のPC登録プログラムがあります.
Native Method Stacks
ここでIntepriterはバイトコードをマシンが理解できるマシン言語に翻訳する.ただし、重複メソッドの再コンパイルを続行すると、パフォーマンスが低下します.
2.だから導入したのはJIT(Just In Time)です.Java陣営では、JITコンパイラを使って速度の差を縮めている.
2.コンパイルと実行方法
コンパイルとは、JVMが理解できるように、人が作成したソースコードをバイトコードに変換することです.
デフォルトでは、javaを上位バージョンにコンパイルするバイトコードは、下位バージョンとして実行できません.(特別なオプションがある場合は、下位バージョンで実行できます)
より低いバージョンでコンパイルされたバイトコードは、より高いバージョンで実行できます.
class Hello {
public static void main(String[] args) {
System.out.println("hello hello");
}
}
上記の内容を持つHelloJavaファイルがあると仮定します.ファイルをコンパイルします.
$ javac Hello.java
Hello.classという名前のクラスファイルが作成されます.
ファイルを実行してみます.
$ java Hello
コンパイルはjavacコマンドを使用します.Java拡張子を使用しますが、実行します.拡張子classは使用しません.
3.バイトコードは何ですか
ソース:http://www.tcpschool.com/java/java_intro_programming
バイトコードは、JVMが実行するコマンドの形式です.
図に示すように、コンパイラはjavaファイル->クラスファイルに変換します.
4.JITコンパイラは何ですか。どのように動作していますか。
Just In Timeの略語
JITの導入理由は、上記の実行エンジン部分で簡単に説明した.ここではJITのやることがなぜこんなに速いのか教えてあげます
Javaは実際に実行するには2回の翻訳が必要です.その通訳.
1.ユーザ(ソースコード)->JVM(成果物:バイトコード)
2.JVM(バイトコード)->実際のマシン(成果物:マシン)
このまま二度になる
JVMでは、メソッドが実行されると、バイトコードは1行1行、割り込み方式で翻訳される.(エンタープライズクラス)
ただし、クラスをロードすると、JVMはコードを解析し、よく発生するバイトコードを一度にマシンに翻訳してキャッシュします.(メモリ内)
これにより、JITは性能を向上させることができる.
5.JDKとJREの違い
ソース:https://www.geeksforgeeks.org/difference-between-jdk-and-jre-in-java/
JRE: Java Runtime Environment
JDK: Java Devleopment Kit
JREは、その名の通りJavaを実行する環境です.
JDKはJavaのプログラミング環境です.
したがって、Javaを実行できるJVMはJREに含まれます.
言い換えれば、プログラミングには環境が必要です.
従って、JREはJDKのサブセットと呼ぶことができる.
Reference
この問題について([Basic-Java] 01. JVMとは、javaコードの実行方法), 我々は、より多くの情報をここで見つけました https://velog.io/@devduhan/Basic-Java-01.-JVM은-무엇이며-자바-코드는-어떻게-실행하는-것인가テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol