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

推薦する

ウェブサイト外部リンクの高品質かつ多様な構築方法の分析

百度のアルゴリズムがどんなに革新しても、ウェブサイトの外部リンクは百度が対象ウェブサイトの品質を判断...

Baidu に新しいウェブサイトをできるだけ早くインデックスさせる方法について簡単に説明します。

最近、新しいウェブサイトを作成し、最適化する必要があったため、新しいウェブサイトがどのように Bai...

onevps: シンガポール直接接続 VPS レビュー、1Gbps 帯域幅/10T トラフィック

onevpsはどうですか? onevps ping、onevps テスト、onevps の速度はどれ...

ウェブサイトの降格や禁止は、実際には検索エンジンによる警告ゲームです。

ウェブサイトがKアウトされる事件が相次いでいます。6月から現在まで、ウェブサイトがKアウトされること...

SEOサービス業界には3つの柱があり、起業界の混乱の中で3つの王国が出現した

三国時代には三つの勢力が対立していたと言われており、『三国志演義』は歴史上の最高傑作です。しかし今、...

百度はソーシャル検索に注目し始めており、SEOに影響を与える可能性がある

Admin5 Webmaster Networkは2月29日、昨日、百度開放型ブランドゾーンがプロモ...

ハイブリッドクラウドファイルシステムを使用して組織のストレージニーズを満たす

今日、大規模なハードウェアを購入したり維持したりする必要がないため、コスト、拡張性、効率性の利点を享...

ネットワーク最適化は価値の時代に戻る必要がある

どの業界も、成長から発展への転換期、つまり初期の混乱から後期の秩序への移行期を経ます。ネットワーク最...

2022年に人気の欧米トレンドに関する洞察

年末の販促シーズンが近づくにつれ、消費者のショッピング意欲は高まり続けています。このシーズン中にいか...

中国企業のクールカスタマーマーケティング:企業がコストゼロで数千万の露出を獲得できるよう支援

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

検索エンジンにウェブサイトを簡単に飲み込まれないようにする

皆さんは三匹の子豚の物語をよくご存知だと思います。大きな悪いオオカミの攻撃を避けるために、彼らは自分...

連東天下1Gクラウドホストが49元で販売中。賢いユーザーになる方法

クラウドホスティングが洪水と獣のように仮想ホスティング市場を掌握して以来、多くのクラウドホスティング...

SEOとeコマースの関係を探る

「電子商取引」という言葉は、2007 年にインターネット上で最もホットな言葉の 1 つになるはずです...

大手のモバイル インターネット ゲーム: 囲い込み、プラットフォーム、そして未知のもの

(文:季勇青、袁銀、編集者:王奇) Android アプリ ストアで「QQ」を検索すると、モバイル ...