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

推薦する

あらゆるインターネット企業が利用する Kafka がなぜ高速なのか?

データが王様である時代において、膨大なデータの保存、伝送、分析は特に重要になっています。データの保存...

Qvodはグレーゾーンから始まり、すぐに白馬に成長しました。ビデオダークホースの急成長

要点:グレーゾーンから始めて、正式な運営に移行して「ロンダリング」を行うことは、近年の中国のインター...

#ニュース# sharktech (shark): 新しいハードウェア、無料の 60G 防御を備えた新しいサーバーがいくつか追加され、割引が販売されています

sharktech からの最新ニュース: いくつかの新しいサーバー モデルが追加されました。古いハー...

対外貿易マーケティングとプロモーション:主要コミュニティウェブサイトのユーザー分析

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています越境EC企...

「ICTイノベーション賞」が発表され、テンセントクラウドのネイティブセキュリティ製品システムが「クラウドセキュリティ製品リーダーシップ賞」を受賞

クラウド コンピューティングは 20 年近くにわたって発展を続け、クラウド ネイティブの時代に入りま...

offshorededi: 苦情防止サーバー、著作権を 100% 無視、オフショア サーバー、10Gbps 帯域幅、無制限のトラフィック

Offshorededi はベリーズのホスティング会社で、主な事業はオフショア ホスティング、オフシ...

百度指数改定の簡単な分析

今日もいつものように百度指数に行って単語をチェックしてみたところ、百度指数が改訂されたことがわかりま...

hostflyte: 20% 割引コード、cn2 VPS が半年分 8.98 ドルのみ、通常の 4G メモリ VPS が年間 8.8 ドルのみ

hostflyte からの最新のプロモーション メール: 7 月 1 日から 1 週間、coresi...

フォレスターは、クラウドコンピューティングが2019年に「成熟期」に入ると予測している。

「昨年、フォレスターは、クラウド コンピューティングが世界中の企業のデジタル変革を劇的に加速させると...

デジタル政府はこれまで以上に重要

紙の文書からデジタルプロセスへの移行は、資源や人件費の削減など、COVID-19パンデミックのような...

調査によると、クラウドコンピューティングの支出は2021年以降も増加し続ける可能性が高い

調査会社ガートナーの調査によると、多くの企業がコロナウイルスの流行中に業務をクラウドに移行するための...

Chicagovps - 超格安の専用サーバーのご紹介

chicagovps.net は、ダラス、ニューヨーク、シカゴにデータセンターを持つ超安価な独立サー...

Rhino Cloud Networkが勝利:ランキングを着実に向上させ、企業がフルネットワークマーケティングを習得できるよう支援

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますRhino...

PRの価値を正しく理解し、過度に宣伝しない

ウェブサイトのSEOを行う人なら、PR値について知っていると思います。知らない場合は検索すれば出てき...

面接で必ず聞かれるJVMランタイムデータ領域について理解していますか?

[[411100]]序文Java仮想マシンのランタイムデータ領域は面接でよく聞かれます。市場には多く...