[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つの主要コンポーネントから構成されています.

  • メソッド領域
    クラス・ローダが読み出したすべてのクラス・レベル(クラス情報)のデータは、
  • 静的変数を含むここに格納される.
  • JVMごとに1つの領域しかなく、リソースが共有されています.

  • Heap領域
  • プログラムを実行したときに生成されたすべてのオブジェクトとそのインスタンス変数と配列がここに格納されます.
  • メソッド領域と同様に、JVMごとに1つしかありません.참고: Method, Heap 영역은 하나만 존재하고 다중 Thread들이 해당영역의 자원을 공유하기 때문에 여기에 저장된 데이터는 thread-safe하지 않습니다.

  • スタック領域
  • は、すべてのThreadに対して個別のランタイムスタックを作成する.
  • すべてのメソッドのStack Frameの作成が呼び出されます.
  • Stack Frameには3つの要素があります.
  • 1)ローカル可変アレイ:ゾーン変数を含むリポジトリ
  • 2)Open stack:演算を記録するスタック
  • 3)Frame data:情報
  • 、前のスタックフレームの情報、および現在のメソッドが属するクラス/オブジェクトへの参照を含む.
  • すべての領域変数がスタックメモリに作成されます.참고: Stack영역은 공유리소스가 아니기때문에 thread-safe합니다.
    この絵は理解を助けるためだ.各ThreadはStackを作成し、各メソッド呼び出しはStackフレームを作成します.

  • PC Registers
    各Threadには個別のPC登録プログラムがあります.
  • Threadは常に何らかの方法を実行しているが、PCはこの方法で何行目を実行しなければならない.

  • Native Method Stacks
  • Native Methodとは、C、C++などのオペレーティングシステムに依存する言語を使用して作成されたライブラリなどを指す.Java言語では実現しにくい機能を作成するにはNative Methodを使用する必要がありますが、Java Native Interfaceはこのような変換です.
  • すべてのThreadは、Native Method Stackを個別に作成します.
  • 実行エンジンは、実行時データ領域に割り当てられたバイトコードを1つずつ読み出して実行する.
    ここで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のサブセットと呼ぶことができる.