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億を超える。

推薦する

ミックスアイスシティの100億人民元の収益の秘密を解明

2022年9月22日、 Mixue Bingchengは深セン証券取引所のメインボードに目論見書を公...

百度が週次トレンド分析を更新:中秋節と国慶節期間中は更新なし

本日、百度は金曜日の予定通り月例アップデートを行いました。お祭りごとに家族を恋しく思う気持ちが募り、...

百度K駅の各種標識と緊急対応策の分析

今の百度は批判も敗北も許されない。満足できないと、私たちウェブマスターの命をもてあそぶ。いつでもサイ...

spryservers: 「Pi Day」、月額 4 ドル、KVM/3G メモリ/20gSSD/4T トラフィック/フェニックス + ダラス

spryservers は本当に退屈なので、「Pi Day」ホリデー プロモーションを開始しました。...

UCloudのJi Xinhuaがパブリッククラウドの6つの段階を解説

近年、クラウドコンピューティング企業がますます増えています。同時に、多くの業界でも情報化の「アップグ...

中国SEOの現状 簡単にランキングを獲得する方法

Sunshine Home Blog は、いわゆる SEO を行うことは実は非常に簡単なことだと考え...

データとインテリジェンスがマーケティングの原動力となり、NetEase Smart Enterprise Services は C2B 時代の新しいマーケティング手法を模索しています。

新しいテクノロジー、新しいビジネス、新しいモデル: 長年の発展を経て、電子商取引業界はもはや単一のオ...

Baidu の最適化は行き詰まりました。SEOER は他に何ができるでしょうか?

現在の検索エンジン最適化の発展から判断すると、新しいものは何もないようです。コンテンツのほかに、外部...

ipage - 無制限ホスティングが 23% オフ/com/net を無料で入手

海外の有名な仮想ホスティング会社であるipageは、bluehost、hostgatorなどと同じコ...

新疆のウェブマスターの皆様へ:9月15日には6,000以上のウェブサイトが登録抹消される予定です

以前、A5は、関連する専門資格が必要であるため、新疆のウェブマスターの登録が拒否されたと報じた。ウェ...

#実用的な推奨事項# iwfhosting: $10/6g メモリ/50g SSD/3T トラフィック/5 コンピュータ ルーム

iwfhosting は、あまり知られていないと思います。17 年の歴史を持つ古いビジネスです。正式...

Weiboマーケティングは、競争の激しいケータリング業界で目立つことを可能にします

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス飲食業界は、あらゆる業界...

羅永浩の売上高は97%急落。本当に遅れをとったのか?

ここ二日間で、羅永浩は再び人気が高まった。多くの記事が議論している: ライブストリーミング100日後...

情報フロー型広告の巨人たちの戦いで、最終的な勝者は誰になるのでしょうか?

序文: 2018年、中国の情報流通広告市場規模は1173.5億元に達すると予想されており、成長の勢い...