JVM と GC を理解するための 10 の質問

JVM と GC を理解するための 10 の質問

[[335561]]

すべての Java 開発者は、日常業務や面接で JDK、JVM、GC の問題に遭遇します。この記事では、次の 10 の質問から始まり、JVM のあらゆる側面を包括的に理解できるようにします。

  1. JVM、JRE、JDK の違いと接続
  2. JVM とは何ですか?そしてその主な機能は
  3. JVM のコア機能は何ですか?
  4. クラスロードのメカニズムとプロセス
  5. ランタイムデータ領域の論理構造
  6. JVM メモリ モデル
  7. 物体がゴミかどうかを判断する方法
  8. ガベージコレクションアルゴリズムとは何ですか?
  9. さまざまなガベージコレクターがリリースされました
  10. JVMチューニングパラメータの設定

1. JVM、JRE、JDKの違いと関係

これは基本的に、Java の世界への入門レベルの知識認識です。まず、Java 公式サイトからの写真を見てみましょう。

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

「JDK」は一般に Java 開発キットとして知られており、Java ランタイム環境 JRE (Java ランタイム環境)、一連の Java ツール (javac/java/jdb など)、および Java ベースのクラス ライブラリ (つまり、rt.jar を含む Java API) が含まれています。

しかし、JRE と JDK はどちらも JVM に基づいています。 JVM は、Java プログラムが特定のマシン上で実行されるための最低レベルの保証であると言えます。

2. JVM とは何でしょうか?その主な機能は何ですか?

JVM は Java Virtual Machine の略です。その目的は、私たちが作成した Java プログラムを、異なるオペレーティング システムの異なる CPU 上で実行できるようにすることです。私たちが作成する Java プログラムは、開発ツール (Intellij idea など) を使用して .class ファイルにコンパイルされますが、このクラス ファイルはオペレーティング システムによって直接認識され、実行することはできません。コンパイルされた .class ファイルを JVM 仕様に従ってマシン語に変換し、それを CPU に送信してオペレーティング システムで実行する必要があります。

JVM の主な機能を一言で評価すると、JVM は特定のオペレーティング システム プラットフォームに関連する情報をシールドするため、Java プログラムは Java 仮想マシン上で実行されるターゲット コード (バイトコード) を生成するだけで済み、変更なしで複数のプラットフォームで実行できます。

3. このような強力な JVM のコア機能は何ですか?

JVM のコア機能は、一般的に次の 3 つの部分に分かれています。

  1. クラスローダー: JVMの起動時またはクラスの実行時に、必要なクラスファイルをJVMにロードします。
  2. 実行エンジン: ランタイム データ領域 (プログラム カウンター、ローカル メソッド スタック、仮想スタックなど) の割り当てを含むクラス ファイルの実行を担当し、最終的にクラス内のバイトコード命令をマシン命令に変換して、オペレーティング システムを通じて実行するために CPU に渡します。
  3. ガベージコレクター: JVM のヒープメモリを管理し、不要なリソースをタイムリーにリサイクルしてメモリスペースを解放します。

4. JVM クラスの読み込みメカニズムとプロセスは何ですか?

まず、開発ツールによってコンパイルされたクラス ファイルが JVM によってどのようにロードされるかについて説明します。いわゆるクラス ローディング メカニズムは、実際には、仮想マシン (JVM) がクラス ファイルをメモリにロードし、その正確性をチェックし、チェックに合格したら解析して初期化し、最後にクラス ファイルをメモリ内で直接使用できる java.lang.Class オブジェクトに変換するというものです。

クラス ファイルのロードから破棄までのライフ サイクルは、基本的に、ロード、リンク (検証、準備、解析)、初期化、使用、アンロードの 5 つの段階に分けられます。

  1. ロード: ロードフェーズには3つのタスクがあります: (1) クラスの完全修飾名で定義されたバイナリバイトストリームを取得します。これにはクラスローダーの助けが必要です。 (2)ランタイムデータ領域の「メソッド領域」に、クラスの基本情報、定数、静的変数など、このクラスの情報を格納する領域を割り当てる。 (3)このクラスのjava.lang.Classオブジェクトを「Javaヒープ」メモリに生成し、このクラスを使用するためのエントリポイントを公開します。
  2. リンク: リンクフェーズにも3つのタスクがあります: (1) 検証: ファイル形式、メタデータ、バイトコード、シンボル参照を検証して、ロードされたクラスの正確性を確認します。 (2)Prepareでは、静的変数にメモリを割り当て、デフォルト値に初期化します。 (3)解決:解決フェーズは、仮想マシンが定数プール内のシンボリック参照を直接参照に置き換えるプロセスである。解析アクションは主に、クラスまたはインターフェース、フィールド、クラス メソッド、インターフェース メソッド、メソッド タイプ、メソッド ハンドル、および呼び出し修飾子の 7 種類のシンボリック参照に対して実行されます。
  3. 初期化: 初期化フェーズで行われる作業は、クラスの静的メンバー変数と静的メソッドを初期化または呼び出すことです。

たとえば、上記の静的変数 age の値は初期化後に 10 になります。

ロードフェーズのステップ(2)と(3)では、ランタイムデータ領域、ヒープ、メソッド領域などの用語が見つかります。では、「ランタイム データ領域」とは正確には何であり、その構造コンポーネントは何でしょうか?

5. JVM ランタイム データ領域とは何ですか?そしてその論理構造

「ランタイム データ領域」は、Java プログラムの実行中にメモリを管理する目的で、JVM によってメモリを複数の異なる領域に分割するように設計されています。これらの領域にはそれぞれ独自の用途があります。一部の領域には、仮想マシンと同様のライフサイクルがあります。これらは仮想マシン プロセスの開始時に存在し、仮想マシン プロセスが終了すると消えます。一部の領域は、ユーザー スレッドの開始と終了に応じて作成および破棄されます。詳細は以下の通りです。

方法領域:

(1)クラス情報、定数、静的変数、ジャストインタイムコンパイラによってコンパイルされたコード、および仮想マシンによってロードされたその他のデータを格納するために使用されます。

(2)メソッド領域は、すべてのスレッドで共有されるメモリ領域である。同じクラス情報のコピーを 1 つだけロードする必要があるため、仮想マシンの起動時に作成されます。

(3) Java仮想マシン仕様では、メソッド領域はヒープメモリの論理的な一部として説明されていますが、Javaヒープと区別するために「非ヒープ」と呼ばれる別の別名があります。 JDK8 より前では、メソッド領域は Perm スペースと呼ばれていましたが、JDK8 以降では Metaspace (つまりメタデータ領域) と呼ばれています。

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

Java 仮想マシン スタック: Java 仮想マシン スタックはスレッドに固有またはプライベートであり、スレッドの作成時に作成されます。スレッドの実行状態 (どのメソッドが呼び出されているか) は、このスレッドに対応する仮想マシン スタックによって保存されます。

スレッドによって実行される各メソッドは、仮想マシン スタック内のスタック フレームです。メソッドが呼び出されると、スタック フレームがスタックにプッシュされます。メソッド呼び出しが完了すると、スタック フレームがスタックからポップされます。以下のように表示されます。

プログラム カウンター (Pc レジスタ): JVM プロセスでは複数のスレッドが実行されており、スレッド内のコンテンツが実行権限を持つかどうかは CPU のスケジュールによって決まることは誰もが知っています。スレッド A がどこかで実行中に突然 CPU 実行権を失ってスレッド B に切り替わった場合、スレッド A が CPU 実行権を取り戻したときに、どのようにして実行を継続できるでしょうか?このため、スレッドが実行される場所を記録するために、スレッド内に変数を保持する必要があります。これはプログラムカウンターです。

ネイティブ メソッド スタック: ネイティブ メソッド スタックが果たす役割は、仮想マシン スタックの役割と非常に似ています。それらの唯一の違いは、仮想マシン スタックは仮想マシンに Java メソッド (バイトコード) の実行を提供するのに対し、ネイティブ メソッド スタックは仮想マシンで使用されるネイティブ メソッドを提供するという点です。つまり、現在のスレッドによって実行されるメソッドがネイティブ タイプの場合、これらのメソッドはローカル メソッド スタックで実行されます。

まとめると、JVM の設計仕様によれば、使用の観点から、JVM のメモリは、スレッド専用メモリ領域とスレッド共有メモリ領域に大まかに分けられます。

スレッドプライベートメモリ領域は、クラスローダーがクラスファイルをコンパイルする際に、実行に必要な「プログラムカウンタ」と「仮想スタックフレーム」に必要なスペースを決定するもので、現在の実行スレッドの生成とともに生成され、実行スレッドの消滅とともに消滅します。したがって、「スレッド専用メモリ領域」では、メモリ管理やガベージコレクションの問題を考慮する必要はありません。

スレッド共有メモリ領域は、仮想マシンの起動時に作成され、すべてのスレッドによって共有されます。これは、Java 仮想マシンによって管理されるメモリの中で最も注目に値する最大の領域です。

<<:  「数秒で理解できます!」 JVM 仮想マシンの詳細なグラフィックとテキストの説明!全然難しくない

>>:  Tencent Cloud TDSQLはFutuのコアシステムをサポートし、ピーク時のクエリ量は1日あたり50億を超える。

推薦する

SEO推進チームを結成するために必要な条件を共有する

ことわざにあるように、優れた兵士は悪い将軍を作ります。優れたチームには、それを管理する適切なリーダー...

ゲームの観点から、ユーザーの粘着性を高めるために習得できる「ルーチン」とは何でしょうか?

ゲームやゲーミフィケーション活動は、当然のことながら、ユーザーの粘着性とアクティビティが強くなります...

共同購入サイトは利益のジレンマに陥っている:資本は逃げようとしている

10月19日、共同購入サイト「24quan」は突然公式サイトで声明を発表し、同社が一時的に「長期休暇...

スノーデン氏、米国と英国が世界中で数十億のSIMカード情報を盗んだことを明らかに

2月19日の英国紙ガーディアン紙の報道によると、元CIA職員のエドワード・スノーデン氏が公開した最新...

emlogウェブサイト構築の長所と短所の分析

多くのウェブマスターにとって、よく知られているwpやzblogに加えて、emlogブログも徐々に人々...

重複ページが大量にある場合の症状

検索エンジンによるインデックス作成を容易にするために、URL を静的または疑似静的に設定することがよ...

クラウドデータベースの選択では「CAP定理」は避けられない?

1980 年代初頭と比較すると、今日のデータベース技術は大きく進歩しました。ハードウェアの選択に関し...

ウェブマスターネットワークレポート:決済ドメイン名の価値は10年間で500倍以上増加。CtripとQunarが合併

1. 決済ドメイン名の価値は10年で500倍以上に上昇!決済ドメイン名の所有者は124万元で変更され...

ウェブサイトの運営とデータ分析について

SEOにはデータ分析は必要でしょうか?個人的には、小規模なサイトでは必要ないかも知れませんが、中規模...

virpus-7 USD/3か月/512Mメモリ/onappクラウド

この VPS の機能についてお話ししましょう。onapp ベース、XEN 仮想化、データ損失の心配な...

数秒で記事を収集する方法をお教えします

西安 SEO によると、現在多くのウェブマスターは、記事がすぐに集まるのは運次第だと考えています。こ...

最後に、SEO業界についての私の理解についてお話しします。

本日退職手続きが完了しました。現在の会社を辞め、新たな人生をスタートします。今後もSEOは続けていく...

ソーシャルショッピング共有サイトは「数千P戦争」でどのように目立つことができるでしょうか?

みなさんこんにちは。私は新米ウェブマスターの Jiyiyi です。今日は、大人気の「ソーシャル ショ...

ウェブサイトの最適化SEOの考え方の重要性について話す

ウェブサイトの SEO 最適化のプロセスでは、優れた SEO アイデアは、より多くのテクニックよりも...