[コンセプトと実装方法&構成]
5587 ワード
JVMとは?
Java仮想マシンの略.
Javaを実行する仮想マシン.
Javaはオペレーティングシステムに依存しないという特徴があります.オペレーティングシステムの実行に依存しないためには、オペレーティングシステム上でJavaを実行する必要があります.それがJVMです.
つまり、オペレーティングシステムに依存せず、CPUがJavaを認識して実行できる仮想マシンです.
Javaソース、すなわちオリジナルコード(*.java)は、CPUが認識できないため、マシン言語でコンパイルする必要があります.
しかしJavaはこの仮想マシン(JVM)を介してオペレーティングシステムに到達するため,オペレーティングシステムが認識できるマシン言語に直接コンパイルするのではなく,JVMが認識できるJavaバイトコード(*.class)である.
変換されたバイトコードはマシン言語ではないため、すぐにオペレーティングシステム上で実行されません.
このとき、JVMはOSがバイトコードを理解していると解釈する.したがって、Byteコードは、オペレーティングシステムを必要とせずにJVM上で実行できます.
オペレーティングシステムに依存せず、Javaファイルを作成するだけでJVM上でデバイスを実行できます.
実行方法
JVMは、これらのメモリを用途に応じて複数の領域に分けて管理します.
これらの実行中、JVMは必要に応じてThread SynchronizationやGCなどの管理タスクを実行します.
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
cd ~
javac HelloWorld.java
java HelloWorld
JVMの構成
Class Loader(クラスローダ)
クラス(.classファイル)をJVMにロードし、リンクで配置するモジュール.Runtimeでクラスを動的にロードします.jarファイルに格納されているクラスをJVMにマウントし、使用しないクラスをメモリから削除します.(コンパイラロール)Javaは、動的コード、コンパイル時ではなく、実行時を参照します.つまり、クラスを最初に参照すると、クラスがロードされ、リンクされます.このロールはクラス・ローダによって実行されます.
実行エンジン
クラスの役割を実行します.クラスローダは、実行エンジンによって実行されるJVMのランタイムデータ領域にバイトコードを配置します.JAvaバイトコードは、機械が直ちに実行できる言語ではなく、比較的見やすい形式で記述されている.したがって,実行エンジンはこれらのバイトコードを実際にJVM内部機器が実行可能な形式に変更する.この場合、2つの方法が使用されます.
Interpreter(interpreter)
実行エンジンはjavaバイトコードを命令単位で読み出して実行する.しかし,この方式はinterpret言語の欠点を残している.1行1行実行なので遅いです.
JIT(Just - In - Time)
JITコンパイラは割り込み方式の欠点を補うために導入された.これは、割り込み方式で実行し、適切な時間にバイトコード全体をコンパイルしてネイティブコードに変更した後、対応する割り込みを行わずに、そのままネイティブコードで実行する方法です.ネイティブコードはキャッシュに保存されているため、1回のコンパイル後のコードは迅速に実行されます.もちろん、JITコンパイラのコンパイルはバイトコードの割込み時間よりもずっと長いので、一度しか実行しないコードであれば、コンパイルせずに割込みを行うことが有利である.したがって,JITコンパイラを用いたJVMは内部でこの方法の実行頻度をチェックし,一定範囲を超えた場合にのみコンパイルを実行する.
Garbage collector
GCを実行するモジュール(スレッド)があります.
//GCに関する詳細は後述する.
Runtime Data Area
オペレーティングシステムが
Threadは最初に作成され、作成するたびに空間が作成され、各スレッドに1つずつ作成されます.Threadは、現在実行されているJVMコマンドのアドレスであるどの部分で実行する必要があるかを記録する.
2)JVMスタック領域
プログラム実行中に一時的に割り当てられた領域は,メソッドを離れると破棄された特性データを格納することができる.様々な形式の変数または一時的なデータ、スレッド、またはメソッドの情報を格納します.メソッドが呼び出されるたびに、各スタックフレーム(メソッドにのみ使用される空間)が生成されます.メソッドが完了したら、フレームごとに削除します.メソッドで使用される値(localvariable)を格納します.また,呼び出しメソッドのパラメータ,領域変数,戻り値,計算時に発生した値を一時的に格納する.
3) Native method stack
これはJavaプログラムコンパイルで生成されたバイトコードではなく,実際に実行可能なマシン言語で記述されたプログラムを実行する領域である.JAVAではなく他の言語で書かれたコードの空間です.JAVA Native Interfaceからバイトコードに変換して記憶する.通常のプログラムのようにカーネルが独立してプログラムを実行する領域を積み重ねます.このセクションでは、Cコードを実行してKernelにアクセスできます.
4) Method Area (= Class area = Static area)
クラス情報を初めてメモリ領域にアップロードしたときに初期化されたターゲットのメモリ領域を格納します.立ち上がり方法のバイトコードは、プログラムフローを構成するバイトコードである.Javaプログラムはメインメソッドの呼び出しから、メソッドの呼び出しまで続くからです.ほとんどのインスタンスの作成も、メソッド内のコマンドと呼び出しです.実際、コンパイルされたバイトコードの大部分はメソッドバイトコードであるため、ほとんどのバイトコードを上に移動することができる.この空間にはRuntime Constant Poolという独立した管理領域も存在する.重複を保存、参照、および防止する役割を果たします.
アップグレード情報のタイプ
1) Field Information
メンバー変数の名前、データ型、アクセス制御者について
2) Method Information
メソッドの名前、戻りタイプ、パラメータ、アクセス制御者について
3) Type Information
ストレージクラスまたはインタフェース/タイプのプロパティ、フルネーム、スーパークラスのフルネーム(インタフェースまたはオブジェクトを除く)
メソッド領域がクラスデータ用の空間である場合、heap領域はオブジェクト用の空間である.
Heapと同様にGCの管理対象にも含まれています.
5)heap(臀部領域)
オブジェクトの仮想メモリ領域を格納します.new演算子によって生成されたオブジェクトと配列を格納します.もちろんclassarea領域にアップロードされたクラスのみがオブジェクトとして生成されます.お尻は3つの部分に分けることができます.
Permanent Generation
生成されたオブジェクトの情報のアドレス値が格納される空間.クラスローダがロードしたクラス、メソッドなどのメタデータ情報格納領域は、JVMによって使用される.反射を使用してクラスを動的にロードします.内部で反射機能をよく使うSpring Frameworkを使う場合は、この分野を考慮する必要があります.
New/Youngエリア
New Areaでしばらく参照されていた、生き残ったオブジェクトが格納された空間Eden領域にオブジェクトが満たされている場合、最初の二次GC(minor GC)が生成される.Eden領域の値をSurvivor 1領域にコピーし、この領域以外の領域のオブジェクトを削除します.
インスタンスの消失方法と消失時間は地域変数とは異なるためhipという個別領域に割り当てられる.Java仮想マシンは、インスタンスを合理的に破棄します.インスタンスが存在しない理由がある場合は消滅する.
リファレンス(リファレンス)
Reference
この問題について([コンセプトと実装方法&構成]), 我々は、より多くの情報をここで見つけました https://velog.io/@mon99745/JVM-개념-실행방법-구성テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol