Java 仮想マシン: JVM の概念と原理の詳細な説明と GC メカニズムの分析

Java 仮想マシン: JVM の概念と原理の詳細な説明と GC メカニズムの分析

[[311892]]

1. Javaヒープ:

(1)はJava仮想マシンが管理する最大のメモリブロックです。

(2)仮想マシンの起動時に作成されます。ヒープは JVM のすべてのスレッドによって共有されます。

(3)オブジェクトインスタンスを保存することが唯一の目的です。ほぼすべてのオブジェクト インスタンスと配列は、ここでメモリを割り当てる必要があります。

2. JVMスタック(Java仮想マシンスタック):

(1)各スレッドが生成されると、JVMスタックフレームが生成されます。 JVM スタック内の各スタック フレームには、現在のスレッドの基本型のローカル変数が格納されます。

3. ネイティブメソッドスタック:

(1) JVMのネイティブメソッドとは、修飾子が「native」であるが、メソッド本体がJavaコードで記述されていないメソッドです。

(2)その機能はJava仮想マシンスタックの機能と似ているが、仮想マシンスタックはJavaメソッドを実行するために仮想マシンに機能し、ローカルメソッドスタックは仮想マシンが使用するネイティブメソッドに機能するという点が異なる。

(3)スレッドプライベートであり、そのライフサイクルはスレッドと同じであり、各スレッドに1つずつ存在する。

4. 方法領域:

(1)仮想マシンの起動時に作成されます。すべての JVM スレッドによって共有されます。

(2)仮想マシンによってロードされたコンパイルされたメソッド実装のすべてのクラス情報、定数、静的変数、およびバイナリマシン命令セットを格納するために使用されます。

5. プログラムカウンタレジスタ:

PC レジスタとも呼ばれる、現在のスレッドによって実行されたバイトコードの行番号のインジケータとして見なすことができる、より小さなメモリ空間です。

仮想マシンの概念モデルでは、バイトコード インタープリターは、このカウンターの値を変更して、次に実行するバイトコード命令を選択することで動作します。分岐、ループ、ジャンプ、例外処理、スレッド回復などの基本機能はすべて、このカウンターに依存して完了します。


概要: 仮想マシン スタック、ローカル メソッド スタック、プログラム カウンターの 3 つのモジュールはスレッド専用です。モジュールの数はスレッドの数と同じで、モジュールの宣言サイクルは、モジュールが属するスレッドの宣言サイクルと一致します。プログラムカウンタを例にとると、スレッドを順番に切り替えて実行時間を割り当てることでマルチスレッド化が実現されます。

そのため、スレッドが正しい実行位置に戻ると、各スレッドは独立したプログラム カウンターを持ち、スレッド間のカウンターは互いに影響を及ぼさず、独立して保存されます。残りは JVM 仮想マシンのライフサイクルと共有されます。

6. クラスローダーサブシステム:

(1)指定されたクラス名(java.lang.Objectなど)に従って、クラスファイルの内容をRuntimedataareaのmethodareaにロードします。

(2)(1)のロード処理は、クラスローダーが起動されると、クラスローダーはJVMのヒープ内に存在し、その後ホストハードディスクに移動してA.classをJVMのメソッド領域にロードします。

7. 実行エンジン:

(1)クラスローダーサブシステムからロードされたクラスのメソッド領域に含まれる命令セットの実行を担当する。平たく言えば、クラスローダーサブシステム

(if を使用する場合、add、subtract) はすべて命令の形式でメソッド領域にロードされ、実行エンジンがこれらの命令の実行を担当します。

8. 通訳:

バイトコード命令を 1 つずつ読み取り、解釈し、実行します。命令を一つずつ解釈して実行するため、バイトコードは速く解釈できますが、実行は遅くなります。これはインタープリタ型言語の欠点です。バイトコードの「言語」は基本的に解釈されます。

9. コンパイラ:

(1. ジャストインタイムコンパイラは、インタープリタの欠点を補うために導入されました。実行エンジンは最初にインタープリタ方式で実行し、適切な場合にジャストインタイムコンパイラがバイトコード全体をネイティブコードにコンパイルします。

(2. その後、実行エンジンは実行メソッドを解釈する必要がなくなり、ネイティブ コードから直接実行できるようになります。ネイティブ コードの実行は、行ごとに解釈するよりもはるかに高速です。ネイティブ コードはキャッシュに保存されるため、コンパイルされたコードは非常に高速に実行できます。

9.1. jdk、jre、JVM の関係:

JDK (Java Development Kit) は、Java 言語用のソフトウェア開発キット (SDK) です。 JDK インストール ディレクトリには jre ディレクトリがあり、その中に bin と lib の 2 つのフォルダが含まれています。

ここで、bin にあるのは jvm、lib にあるのは jvm が動作するために必要なクラス ライブラリであり、jvm と lib を合わせて jre と呼ばれていると考えることができます。

10. 上の図では、ヒープメモリは 3 つの部分に分かれています。

(1. 新生児領域: クラスが生まれ、成長し、消滅する領域です。クラスは生成され、適用され、最後にガベージ コレクターによって収集されてその寿命を終えます。

(2. 退役領域:新規領域から選択された JAVA オブジェクトを格納するために使用されます。通常、プール オブジェクトはこの領域でアクティブになります。

(3. 永続記憶領域は、JDK 自体が持つクラスとインタフェースのメタデータを格納するために使用される常駐メモリ領域です。

つまり、動作環境に必要なクラス情報を格納します。この領域にロードされたデータは、ガベージ コレクターによってリサイクルされません。この領域が占有するメモリは、JVM がシャットダウンされたときにのみ解放されます。

11. java.lang.OutOfMemoryError: Java ヒープ スペース例外が表示され、Java 仮想マシンのヒープ メモリが不足していることを示します。

理由は2つあります。

(a. Java 仮想マシンのヒープ メモリ設定が不十分です。-Xms および -Xmx パラメータを使用して調整できます。

(b. コード内に大量の大きなオブジェクトが作成され、ガベージコレクターで長時間収集できない(参照されている)。

12. 親の委任メカニズム:

JVM は、クラスをロードするときに、デフォルトで親委任メカニズムを使用します。簡単に言うと:

つまり、特定のクラスローダーがクラスのロード要求を受け取ると、まずロードタスクを親クラスローダーに委任し、その後再帰的にロードします(bootStrap、extclassLoader、appclassloaderは親クラスローダーと子クラスローダーです)。

親クラスローダーがクラスロードタスクを完了できる場合は、正常に戻ります。親クラスローダーがこのロードタスクを完了できない場合にのみ、それ自体がロードされます。

13. フル GC はいつ発生しますか?

(1)System.gc()メソッドの呼び出し

(2)旧世代のスペース不足[オブジェクトが新世代に転送され、大きなオブジェクトや大きな配列が作成される場合にのみ、旧世代のスペースが不足します]

(3)不滅ゾーンのスペースが不足している。

(4)大きなオブジェクトをヒープ内に割り当てます。 [たとえば、非常に長い配列の場合、このタイプのオブジェクトは古い世代に直接送られます]

(5)CMS GC中に昇格が失敗し、同時モード障害が発生する

14. GCリカバリの内容:

GC の主な機能は、ヒープ内のオブジェクトをリサイクルすることです。オブジェクトへの参照が存在するかどうかを分析することで、存在しない場合はリサイクルできます。

15. gcの具体的なプロセス:

これは主に、どのリサイクル アルゴリズムが使用され、どのガベージ コレクションが使用されるかによって異なります。主なリサイクル アルゴリズムは次のとおりです。

(1)マークスイープアルゴリズム

(2)マーククリアアルゴリズム

(3)複製アルゴリズム

(4)世代別コレクションアルゴリズム

16. よく使われるガベージコレクター:

(1)シリアルコレクター[シリアルコレクター]

(2)ParNew Collector [シリアルコレクタのマルチスレッド版]

(3)パラレルスカベンジコレクター[PSコレクター]

(4)CMS [旧世代コレクター]

(5)G1コレクター

ガベージ コレクターの使用に関しては、参考までに次のような提案も組み合わせてあります。

<<:  クラウドへの移行を現実にする方法

>>:  Shanyan Dataの2020年分散ストレージ技術セミナーが成功裏に開催されました

推薦する

UFIDAの業界ベースの業務はより大きな顧客価値を生み出します

2月28日、アジア太平洋地域の企業管理ソフトウェアメーカーであるUFIDAソフトウェア株式会社(以下...

クラウド コンピューティングの利点とメリットは何ですか?

オンプレミスのデータセンターを持つ企業は、IT 運用をクラウドに移行することに消極的になることがあり...

NodeJungle - 4 ドル/kvm/1g メモリ/40g ハードディスク/2T トラフィック

NodeJungleさん、ドメイン名は2月に取得したばかりなので、特に言うことはありません。ただ、い...

クラウド導入を成功させるためのベストプラクティス 10

ビジネスをクラウドに移行することは良いことですが、企業は慎重に進めなければなりません。組織が複数のワ...

ウェブマスターはBaidu 6.28事件を別の視点から見るべきだ

6月28日の事件後、私の2つのウェブサイトはKステーションではなかったにもかかわらず、両方ともトップ...

WordPressのSEOフレンドリー性を向上させる

無駄な話はやめて、本題に入りましょう。 1. WP を選ぶ理由1 これは PHP プログラムです。多...

親子ウェブサイトの発展:垂直型からプラットフォーム型親子ウェブサイトへの変革の道

昨年以来、中国の多くの小売企業は経営の厳しい冬を感じており、利益率は低下し、売上高の伸びは大幅に落ち...

Douban CEO ヤン・ボー: テクノロジーはニーズを解決し、多目的ネットワークを構築する

Abei は楊波(Weibo)の Douban でのオンライン ニックネームであり、Douban の...

SEO の詳細を計画する: ターゲットを絞った作業方法

「どの国にも法律があり、どの家庭にもルールがある。」この言葉は、さまざまな場所で何度も耳にします。確...

テンセントクラウドはバーレーンにデータセンターを設立し、海外事業展開を加速すると発表した。

3月1日、テンセントクラウドとバーレーン王国経済開発委員会は協力に関する覚書を正式に締結した。両者は...

weloveservers-$30/年/kvm/メモリ 1g/ハードディスク 30g/トラフィック 1T/ロサンゼルス/QuadraNet

weloveservers は 2016 年 1 月に初めて Hostcat に登場しました。1G ...

クラウド用に生まれた QingStor 分散ストレージが完全にアップグレードされました。

[51CTO.com からのオリジナル記事] 今日の話は、QingCloud の分散ストレージ製品で...

chicagovps-新しい VPS/月額 1.75 ドル/4 コア/1g メモリ/30g SSD/1.5T トラフィック

chicagovps.net の最新の VPS プロモーションは 2 つのモデルに限定されています。...

タイトルを変更するとあなたの会社は禁止されますか?最終決定権はあなたにあります

ウェブサイトのタイトルを変更すると、Baidu Kステーションになります。これは、多くのウェブマスタ...

P2Pオンライン融資はしばしば損益に打撃を与える:規制当局はインターネット金融に関する新たな政策を策定中

パン・ファーウェイ・デン・シェン過去 1 か月間で、プラットフォームの閉鎖がますます頻繁になりました...