blog

JVMとGCを明確にする10の質問

JVM、JRE、JDKの違いと関係\nJVMとは何ですか?そしてその主な役割\nJVMのコア機能とは\nクラス・ロードの仕組みとプロセス\n実行時データ領域の論理構造\nJVMのメモリモデル\nオブジ...

Jul 12, 2020 · 6 min. read
シェア
  1. JVM、JRE、JDKの違いとつながり
  2. JVMとは?とその主な役割
  3. JVMのコア機能とは
  4. クラス・ロードの仕組みとプロセス
  5. 実行時データ領域の論理構造
  6. JVMのメモリー・モデル
  7. オブジェクトがゴミかどうかを判断する方法
  8. ゴミ収集のアルゴリズムとは
  9. 導入されている様々なゴミ収集器
  10. JVMチューニングのためのパラメータ設定

、JVM、JRE、JDKの違いと接続

以上、基本的にjavaコグニティブの世界に足を踏み入れる入門レベルの知識ですが、まずはjava公式サイトの図をご覧ください:

この図から、基本的に「JRE」はJava言語を実行するために不可欠な実行環境であることがわかります。JREで書かれたJavaプログラムは、ユーザーによって使用されるように実行することができます。

JDK "は、一般的にJavaの実行環境JREとJavaツールやJavaクラスライブラリの束を含むJava開発キットとして知られています。

しかし、それはJREまたはJDKであるかどうかは、基礎としてのJVMに基づいています。JVMは、保証の底にマシン上で実行することができるJavaプログラムであると言うことができます。

、その後、JVMは、その主な役割とは何ですか?

JVMは、Java仮想マシンの略語であり、その用途は簡単ですそれは異なるオペレーティングシステムで書かれたJavaプログラムは、異なるCPU上で実行することができます。書かれたJavaプログラムは、.classファイルにコンパイルする開発ツールを使用しますが、クラスファイルが直接実行するオペレーティングシステムによって識別することはできません、あなたはjvmの仕様に従ってjvmを使用する必要があります機械語に.classファイルにコンパイルされ、その後、実行するためにCPUにオペレーティングシステムに提出されます。

一文では、JVMの主な役割を評価することです:JVMは、特定のオペレーティングシステムのプラットフォームに関連する情報を、Javaプログラムは、Java仮想マシン上で実行されているターゲットコードを生成する必要があるようにシールド、あなたは変更することなく、さまざまなプラットフォーム上で実行することができます。

は、このような素晴らしいJVMのコア機能は何ですか?

3つの部分の全体的な機能のコアにJVMの:

  1. クラスローダー:起動時またはクラスの実行時にJVMに必要なクラスファイルをロードします。
  2. 実行エンジン:実行時データ領域の割り当てを含むクラスファイルの実行を担当し、最終的にクラス内のバイトコード命令をオペレーティングシステムを介してCPUによって実行されるマシン命令に変換します。
  3. ゴミ・コレクター: JVMのヒープ・メモリを管理し、無駄なリソースをリサイクルしてメモリ空間を解放します。

、JVM クラス読み込みメカニズムとプロセス?

まず第一に、生成されたクラスファイルをコンパイルする開発ツールの話は、JVMによってロードされる方法です。いわゆるクラスローディングのメカニズムは、実際には:仮想マシンは、メモリにクラスファイルをロードし、それの正しさをチェックし、チェックし、パースと初期化し、最終的にメモリにクラスファイルを直接使用することができますjava.lang.Lang.Lang.JVMは、クラスファイルをロードすることができます。

クラスファイルのロードから破棄まで、そのライフサイクルは基本的に次の5つの段階に分けることができます:ロード、リンク、初期化、使用、アンロード。

  1. ロード: ロード段階には3つのタスクがあります。

    クラス・ローダーの助けを借りて行われる、完全修飾名によるクラス定義のバイナリ・バイト・ストリームの取得;

    実行時データ領域の「メソッド領域」に、クラスに関する基本情報、定数、静的変数などの情報を格納する領域を割り当てます;

    Javaヒープ・メモリ上にクラスのjava.lang.Classオブジェクトを生成し、クラスを使用するためのエントリ・ポイントを公開します。

  2. リンク: リンク・フェーズにも3つのタスクがあります。

    検証: 読み込まれたクラスの正確さを保証するために、ファイル・フォーマット、メタデータ、バイトコード、シンボリック参照を検証します;

    準備。静的変数のメモリーを確保し、デフォルト値に初期化します。

    resolve (解決) フェーズは、仮想マシンが定数プール内の記号参照を直接参照に置き換えるプロセスです。クラスまたはインターフェイス、フィールド、クラス・メソッド、インターフェイス・メソッド、メソッド・タイプ、メソッド・ハンドル、および呼び出し修飾子 7 の記号参照に対して解析処理が実行されます。

  3. 初期化: 初期化フェーズで行われる作業は、クラスの静的メンバ変数および静的メソッドへの代入または呼び出 しを初期化することです。

例えば、上記の静的変数 age は値 10 に初期化されます。

ロード・フェーズの最初のステップでは、実行時データ領域、ヒープ、メソッド領域などの用語があります。

、JVMの実行時データ領域とは何ですか?とその論理構造

"ランタイムデータ領域 "は、メモリ管理の目的のためにJavaプログラムを実行する過程でJVMは、メモリの設計は、さまざまな領域の数に分かれています。これらの領域は、独自の目的を持って、いくつかの領域は、仮想マシンのプロセスの開始と、仮想マシンのプロセスの終了と仮想マシンの終焉と一緒に、存在する仮想マシンと同じライフサイクルを持っています。一部の領域は、ユーザースレッドの開始と終了によって作成と破棄が行われます。その詳細を下図に示します:

  1. メソッド領域: クラス情報、定数、静的変数、インスタントコンパイラによってコンパイルされたコード、および仮想マシンによってロードされたその他のデータを格納するために使用されます;

メソッド領域はすべてのスレッドで共有されるメモリ領域で、仮想マシンの起動時に作成されます;

Java仮想マシンの仕様では、メソッド領域はヒープメモリの論理的な一部として記述されていますが、Javaヒープと区別するために「非ヒープ」という別名があります。JDK8 ではメソッド領域は Perm space と呼ばれ、JDK8 以降では Metaspace と呼ばれます。

  1. ヒープ:Javaヒープはすべてのスレッドで共有され、仮想マシンの起動時に作成されます。このメモリ領域の唯一の目的は、オブジェクトインスタンスを格納することであり、Java仮想マシンの仕様では、次のように記述されています:すべてのオブジェクトインスタンスと配列は、ヒープ上に割り当てられるべきであるが、JITコンパイラの開発とエスケープ分析技術の段階的な成熟に伴い、スタックの割り当て、スカラー置換最適化技術は、いくつかの微妙な変更が発生するようになります。すべてのオブジェクトはヒープ上に割り当てられ、絶対的な存在ではなくなります。

  2. 仮想マシン・スタック:仮想マシン・スタックはスレッドプライベートまたは排他的で、スレッドの作成と同時に作成されます。スレッドの実行状態は、そのスレッドに対応する仮想マシン・スタックによって保存されます。

メソッドを呼び出すとスタック・フレームがスタックに押し込まれ、メソッド呼び出しが完了するとスタック・フレームがスタックから排出されます。これは次の図に示されています:

  1. プログラム・カウンタ:ご存知のように、JVMプロセスでは複数のスレッドが実行されており、スレッドの内容が実行権を持てるかどうかはCPUのスケジューリングに基づいています。もしスレッドAがどこかで実行されているときに、突然CPUの実行権を失ってスレッドBに切り替わり、その後スレッドAがCPUの実行権を得たときに、どうやって実行を継続できるでしょうか?これは、場所にスレッドの実行を記録するためにスレッド内の変数を維持する必要があり、これはプログラムカウンタです。

  2. ネイティブメソッドスタック:ネイティブメソッドスタックは、仮想マシンスタックと非常によく似た役割を果たしますが、両者の違いは、仮想マシンスタックはJavaメソッドを実行する仮想マシンを提供するのに対し、ネイティブメソッドスタックは仮想マシンで使用されるネイティブメソッドを提供することです。つまり、現在のスレッドがネイティブ・タイプのメソッドを実行する場合、これらのメソッドはネイティブ・メソッド・スタックで実行されます。

要約すると、JVM設計仕様は、JVMメモリの使用の観点から、スレッドプライベートメモリ領域とスレッド共有メモリ領域に大別されます。

スレッドプライベートメモリ領域は、クラスローダが特定のクラスファイルをコンパイルするときに決定され、「プログラムカウンタ」と「仮想スタックフレーム」などの必要な領域の実行は、スレッドの現在の実行の生成とスレッドの実行の死とスレッドの死を伴うことになります。したがって、「スレッドプライベートメモリ領域」でのメモリ管理やゴミ回収を考慮する必要はありません。

スレッド共有メモリ領域」は、仮想マシンの起動時に生成され、すべてのスレッドで共有されます。 Java仮想マシンが管理するメモリの中で最大かつ最も重要な部分です。

JVMのメモリー・モデルはどのように設計され、JVMはどのようにメモリー管理を行うのですか?ゴミ収集アルゴリズムとは何ですか?よく使われるゴミ収集器とは?次回はこれらの質問にお答えします。

Read next

フック 問題記録

完全にオプションです。 既存のコードを書き換えることなく、いくつかのコンポーネントでフックを試すことができます。 フックに破壊的な変更はありません。 ②.コードの再利用が容易:カスタムフックによって状態を再利用するため、クラスコンポーネントのロジックを再利用することが難しい場合があるという問題を解決します。 ③.機能的なプログラミングスタイル:機能的なコンポーネントは、状態が実行時環境に保存されます。

Jul 11, 2020 · 1 min read