JVM、JVMの基礎知識について、本当に知らないのですか?

目次

1. JVMの概念

JVM とは何ですか?

2. JVM 実行プロセス

1. JVM によるクラス ファイルのロードと実行の仕組み

2. JVM 実行時データ (M) に含まれる領域

3. クラスロードの処理(M)

4. 親の委任モデル

1. 親の委任モデルの分析

2. JAVA (M) にはどのようなクラスローダーがありますか

5. ガベージコレクションの仕組み

1. 死んだオブジェクトの特定

①参照カウントアルゴリズム

②アクセシビリティ解析アルゴリズム

 GCルートとは何ですか?

GC ルートには通常、次のタイプがあります。

2. ガベージコレクションアルゴリズム

①マーク除去アルゴリズム

②マークコピーアルゴリズム

③ マーキングアルゴリズム

 ガベージコレクションのプロセス? (男)

1.マイナーGC(新世代のガベージコレクション)

 2.フルGC(旧時代のガベージコレクション)

3. ガベージコレクター

ガベージコレクター(M)の紹介

 主なガベージコレクターは次のとおりです。


1. JVMの概念

JVM とは何ですか?


JVMとは、Java Virtual Machine(Java Virtual Machine)の略で、計算機の仕様であり、コンピュータのさまざまな機能を実際のコンピュータ上で模擬することで実現される架空のコンピュータです 

2. JVM 実行プロセス

1. JVM によるクラス ファイルのロードと実行の仕組み

①.javaファイルが.classファイルにコンパイルされると、.classファイルはクラスローディングサブシステムにロードされ、クラスローディングサブシステムはそのファイルをランタイムデータ領域にロードします。

②ランタイムデータ領域では、クラスオブジェクトがメソッド領域にロードされるため、新しく作成されたインスタンスオブジェクトは、このクラスオブジェクトテンプレートを介して新しいオブジェクトを作成できます。

③作成したインスタンスオブジェクトがヒープにロードされます

④仮想マシンスタック:各スレッドは仮想マシンスタック内のスペースを開き、メソッドが呼び出されるたびにメソッドがスタックにプッシュされます。つまり、各スタックにはメソッド呼び出しのレベルが保存されます。

⑤ローカルメソッドスタック:同様に、各スレッドはローカルメソッドスタック内のメモリを開放し、ローカルメソッドが呼び出されるたびに、ローカルメソッドスタックにローカルメソッドがロードされます。

⑥プログラムカウンタ: 現在のスレッドが実行する命令のアドレスを記録します。マルチスレッドモードでは、Java仮想マシンが、特定のスレッドによって割り当てられたタイムスライスが使い果たされた場合、順番にスレッドを切り替えてタイムスライスを割り当てます。 , 現在のスレッドの実行がまだ終了していない場合は、プログラム カウンタを使用して、現在のスレッドが実行される命令のアドレスを記録する必要があります。現在のスレッドがタイム スライスに再度割り当てられると、以降の実行が継続されます。現在の指示。

2. JVM 実行時データ (M) に含まれる領域

①メソッド領域:JDK1.7以前は永続世代、1.8以降はメタスペースとも呼ばれていましたが、その違いは実装方法の違いであり、メソッド領域はクラスオブジェクトが実装された際に格納される場所です。 JVM にロードされると、クラス オブジェクトはメソッド領域に格納されるため、後でインスタンス オブジェクトを作成する必要があるときに、メソッド領域のクラス オブジェクトからインスタンス オブジェクトを直接取得して作成できます。メソッド領域はすべてのスレッドで共有されることに注意してください。

②ヒープ: 作成されたインスタンス オブジェクトはヒープ領域にロードされ、ヒープ領域のサイズは JVM のパラメータを通じて設定できます。Xms10 (最小ヒープ メモリ領域) はヒープ領域のサイズを設定し、Xmx10 (最大ヒープ)ヒープ領域サイズ: 通常、これら 2 つのメモリ パラメータを同じサイズに設定します。通常、両方のパラメータをスレッドが消費する可能性のある最大ヒープ領域に設定します。メモリ領域が比較的小さい場合、OOM エラーが発生する可能性があります。 ( OUT OF MEMORY ERROR)、このエラーが発生したら、ヒープ領域をより大きく設定できます。

③Java 仮想マシン スタック:各スレッドは仮想マシン スタック内のスペースを開きます。マシン スタック容量のサイズは通常、パラメータ Xss によって決定されます。スタックがオーバーフローすると、StackOverFlow エラーが報告されます。

④ネイティブ メソッド スタック: 同様に、各スレッドはローカル メソッド スタック内のメモリを解放し、ローカル メソッドが呼び出されるたびに、ローカル メソッド スタックにローカル メソッドがロードされます。

⑤プログラムカウンター:現在のスレッドが実行する命令のアドレスを記録します。マルチスレッドモードでは、スレッドによって割り当てられたタイムスライスが使い果たされたときに、Java仮想マシンがスレッドを順番に切り替えてタイムスライスを割り当てることを考慮します。現在のスレッドが実行を終了していない場合、プログラム カウンタを使用して、現在のスレッドが実行される命令のアドレスを記録する必要があります。現在のスレッドがタイム スライスに再度割り当てられると、現在のスレッドから実行が継続されます。命令。

3. クラスロードの処理(M)

1.負荷

すべての .class ファイルを仮想マシンにロードします

2. 検証

.class ファイルの仕様に従って現在のファイルを確認します。

3. 準備する

さまざまな種類の値をデフォルト値に初期化し、int は 0 に、float は 0.0f に初期化されます。

4. 分析

Java 仮想マシン内の定数プールのシンボリック参照を直接参照に置き換えます。これは、定数プールを初期化するプロセスです。(例: 元の定数プール内の文字列は直接参照されません (プレースホルダーのままです)。このプロセスでは、新しい文字列が作成され、定数プール内のプレースホルダーが置き換えられます)

 

5. 初期化

ここまでは準備作業で、実際にクラス内のJavaコードを実行する作業です。この後、実際のJavaオブジェクトが作成されます。

4. 親の委任モデル

1. 親の委任モデルの分析

クラスが異なれば、ロード時に異なるクラスローダーが使用されます。

 クラス ローダーの戦略は次のとおりです: クラスを作成するとき、まず applicationClassLoader から BootStrapClassLoader に上方向に転送します。BootStrapClassLoader は、このクラスが独自のロード パスに存在するかどうかを確認し、存在する場合はロードし、存在する場合は ExtClassLoader に下方向に転送します。 ExtClassLoader は独自のロード パスでこのクラスを探し、存在する場合はロードし、存在しない場合は ApplicationClassLoader に転送し、このクラスを独自のパスで見つけてロードします。

2. JAVA (M) にはどのようなクラスローダーがありますか

5. ガベージコレクションの仕組み

1. 死んだオブジェクトの特定

①参照カウントアルゴリズム

概念: オブジェクトが参照されると、参照の数が 1 ずつ増加します。参照されたオブジェクトが 0 の場合、そのオブジェクトはデッド オブジェクトとしてマークされ、オブジェクトはリサイクルされる必要があります。

回路図は以下の通りです:

 プロセス分析: 2 つのオブジェクトが作成されると、作成された 2 つのオブジェクトを指す 2 つの変数が定義されます。このとき、2 つのオブジェクトの参照は +1 されます。同時に、オブジェクトのインスタンス属性も使用されます。このとき、新しく作成した 2 つのオブジェクトの参照カウントは両方とも 2 ですが、この 2 つの変数を空に設定すると、新しく作成した 2 つのオブジェクトの参照カウントは -1 になります。変数は空です。変数のインスタンス属性はこれら 2 つのオブジェクトにアクセスできなくなりますが、これら 2 つのオブジェクトの参照カウントが 0 になっていないため (インスタンス属性は依然として 2 つのオブジェクトを指している)、これら 2 つのオブジェクトはアクセスできません。リサイクルされた、つまりメモリ リークが発生したことを意味します

注: メモリ リーク:メモリ リーク (メモリ リーク) とは、プログラム内で動的に割り当てられたヒープ メモリが解放されない、または何らかの理由で解放できず、システム メモリが無駄に消費され、速度低下などの重大な結果が生じることを指します。プログラムの実行速度が低下したり、システムがクラッシュしたりすることがあります。

メモリ リークの問題は、プログラムの実行開始時に見つけるのが容易ではありません。プログラムが一定期間実行されると、新しいオブジェクトが継続的にヒープ領域に配置され、時間内にクリアできなくなり、最終的にはヒープ領域が破壊されてしまいます。いっぱいになるとプログラムがクラッシュする原因になります。

②アクセシビリティ解析アルゴリズム

到達可能性解析アルゴリズムの実装原理は、GC ルート(開始ノード集合)からの参照関係に従って上から下へ探索し、その探索経路を「参照チェーン」と呼びます。オブジェクト参照チェーンでは、オブジェクトは到達不能であると言われ、オブジェクトが到達不能であることを示します。


ガベージ コレクション中に、最初にすべてのルート ノードを検索し [ルート ノードを列挙]、次にこれらのルート ノードから上から下に検索します。このプロセスではユーザー スレッドを一時停止する必要があります (つまり、STW をトリガーします)。オブジェクトは予約されており、オブジェクトが検索できない場合は、ガベージ コレクション アルゴリズムを使用して再利用されます。

 GCルートとは何ですか?

GC ルートもオブジェクトであり、JVM がリサイクルしてはならないオブジェクトです。JVM が GC を実行するときは、すべてのユーザーがセーフポイントに到達した後に最初に STW を実行し、すべてのユーザーのスレッドを一時停止し、次にルート ノードを列挙します。をクリックし、上から下に検索します。

GC ルートには通常、次のタイプがあります。

1. メソッド領域の static 属性で参照されるオブジェクトは
一種のグローバルオブジェクトであり、Class オブジェクト自体は再利用が難しく、再利用の条件も非常に厳しいため、Class オブジェクトを再利用しない限り、静的メンバーはリサイクルできません。

2. メソッド領域の定数プールが参照するオブジェクト
も文字列定数プールなどのグローバルオブジェクトであり、定数自体は初期化後に変化しないため、GC ルートであることが合理的です。

3. メソッド スタック内のスタック フレーム ローカル変数テーブルによって参照されるオブジェクトは、
実行コンテキスト内のオブジェクトに属し、スレッドがメソッドを実行するとき、メソッドはスタック フレームにパッケージ化され、スタック上で実行されます。メソッドで使用される変数は、ローカル変数テーブルのスタック フレームに保存されます。メソッドがまだ実行中であり、スタックからポップアウトされていない限り、ローカル変数テーブル内のオブジェクトは引き続きアクセスされ、GC はリサイクルされるべきではないことを意味するため、このタイプのオブジェクトは次のように使用することもできます。 GCルーツ。

4. JNI ローカル メソッド スタックで参照されるオブジェクトは、
1 つが Java メソッド スタックの変数参照であり、もう 1 つがネイティブ メソッド (C、C++) メソッドの変数参照であることを除いて、本質的に前のオブジェクトと同じです。スタック。

5. 同期ロックで保持されている
オブジェクト 同期でロックされているオブジェクトは再利用できないため、オブジェクトロックを保持しているスレッドが存在する場合、GC がオブジェクトを再利用するとロックは無効になります。

2. ガベージコレクションアルゴリズム

①マーク除去アルゴリズム

アルゴリズムのアイデア: 現在のすべてのオブジェクト内で使用できないオブジェクトをマークし、その位置にマークを付けてからクリアします。

欠点: しかし、このアルゴリズムの欠点も明らかです: 使用できないオブジェクトをその場でクリアすると、多数の不連続な空き領域のフラグメントが生成されます。この時点でより大きなオブジェクトを作成する必要があるが、現在の連続的な空き領域が満たされない場合、次のガベージ コレクションをトリガーする必要があります。

 

②マークコピーアルゴリズム

アルゴリズムのアイデア: 使用可能なすべてのスペースをスペース 1 とスペース 2 の 2 つの部分に分割し、スペース 1 で使用できないオブジェクトを削除すると、不連続な空き領域の断片が多数存在します。使用可能なオブジェクトと使用できないオブジェクトが分類されて配置され、ソートが完了するとスペース 1 が全体的にクリアされ、後で再度クリアするときにこの操作が繰り返されます。

欠点: このアルゴリズムの欠点も比較的明白で、各ガベージ コレクション プロセスで実際に役割を果たすことができる領域は半分だけです。

③ マーキングアルゴリズム

アルゴリズムの考え方は次のとおりです。毎回、使用できないオブジェクトをいくつか削除した後、すべてのオブジェクトを並べ替えます。

欠点: クリアごとにソートが必要であり、アルゴリズムの効率が比較的低い

 ガベージコレクションのプロセス? (男)

 異なるクラスオブジェクトは世代に分割され、すべてのクラスオブジェクトは新世代と旧世代に分割され、そのうち新世代はヒープ領域の 1/3 を占有し、古い世代はヒープ領域の 2/3 を占有し、新世代スペースはまだ 1/5 の生存者(生存者は前後 2 つのエリアに分かれる)エリアがあります。オブジェクトは世代ごとに処理され、ガベージコレクションは①マイナーGC(新世代ガベージコレクション)②フルGC(メジャーGC/フルGCは旧世代ガベージコレクションで発生)の2種類に分けられます。

1.マイナーGC(新世代のガベージコレクション)

新世代のガベージコレクションはコピーアルゴリズムを使用します(新世代のオブジェクトは頻繁に反復されるため、比較的効率の高いアルゴリズムが必要です。コピーアルゴリズムは大量のスペースを消費します。プロセスは次のとおりです。


①オブジェクトを作成する際は、エデンエリアに直接作成します この時、サバイバーの両エリアは空いています(空間サイズの比率:エデン:フロム:ト=8:1:1)

②再度オブジェクトを作成し、現在のエデンエリアの容量では現在のオブジェクトを保存できないことが判明した場合、エデンエリアのオブジェクトを判定・処理し、死んでいると判断されたオブジェクトはクリアされます。そして、生き残ったオブジェクトは生存エリア内のフロムエリアに移動され、オブジェクトの「年齢」はフロムエリアに+1されます。

③エデン領域は新規オブジェクトの作成を続け、参照されていないオブジェクトをクリアした後、エデン領域に残っているすべてのオブジェクトをフロム領域に移動し、エデン領域とフロム領域の両方が満杯になります。 toエリアをクリアし、エデンエリアとfromエリアを両方ともクリアし、前のラウンドでfromエリアに置かれたオブジェクトの年齢が1増加します

⑤次のGCではfromエリアとtoエリアの位置が入れ替わりますが、このときtoエリアは空いており、fromエリアとエデンエリアは次のGCにも継続して参加することを繰り返します。上記の手順

⑥ 継続的な GC の後、新しい世代のオブジェクトの年齢が特定のしきい値 (デフォルトのしきい値は 15) に達すると、これらのオブジェクトを古い世代に移動する必要があります。

 概要:新世代のガベージ処理プロセス全体を見てみましょう: GC の各ラウンドで、新しいオブジェクトが Eden 領域に作成されます。Eden 領域の残りの容量が新しいオブジェクトを作成するのに十分でない場合、すべての Eden The領域内に残っているオブジェクトは from 領域に移動されます。次の GC ラウンドでは、from 領域と Eden 領域にあるすべての残りのオブジェクトが to 領域にコピーされ、from 領域と Eden 領域はすべてクリアされ、 to 領域と from 領域はガベージ コレクションを続行するために置き換えられます。

 2.フルGC(旧時代のガベージコレクション)

旧世代のガベージ コレクション戦略では、コピー アルゴリズムではなく、マーク ソート アルゴリズムが使用されます。旧世代に入るオブジェクトは、新世代に比べて頻繁に作成および破棄されないため、マーク ソート アルゴリズムを使用する方が適切です。アルゴリズム。フル GC はマイナー GC よりもはるかに遅いため、JVM チューニング プロセスでは、作業の大部分がフル GC の調整です。

3. ガベージコレクター

ガベージコレクター(M)の紹介

ガベージ コレクターについて話す前に、ガベージ コレクターの開発プロセスについて説明します。 STW はガベージ コレクション プロセス中に実行されるため、すべてのユーザー スレッドはこのプロセス中にスレッド サービスを一時停止する必要があるため、STW 時間を短縮することは無駄です。コレクターはビジネス要件を満たした後に追求する必要があります。当初はシングルスレッドのガベージコレクタが使用されていましたが、プログラム規模の継続的な拡大とプログラム内容の充実に伴い、シングルスレッドのガベージコレクタではユーザーのニーズに応えられなくなり、マルチスレッドのガベージコレクタが使用されるようになりました。プログラムの継続的な開発により、マルチスレッド STW の時間はますます長くなり、STW の時間を短縮するために新しいガベージ コレクターが開始されました。

 主なガベージコレクターは次のとおりです。

  • シリアル コレクター (コピー アルゴリズム)
    新世代のシングル スレッド コレクターは、マーキングとクリーニングの両方がシングル スレッドであり、シンプルで効率的であるという利点があります。これはクライアント レベルのデフォルトの GC メソッドであり、-XX:+UseSerialGC強制的に指定できます。
  • Serial Old コレクター (マーク照合アルゴリズム)
    旧世代のシングルスレッド コレクター、シリアル コレクターの古いバージョン。
  • ParNew コレクター (ストップコピー アルゴリズム) 
    新世代コレクターは、シリアル コレクターのマルチスレッド バージョンと考えることができ、マルチコア CPU 環境ではシリアルよりも優れたパフォーマンスを発揮します。
  • パラレル スカベンジ コレクター (ストップコピー アルゴリズム)
    高スループットと CPU の効率的な使用を追求したパラレル コレクター。通常、スループットは 99% であり、スループット = ユーザー スレッド時間/(ユーザー スレッド時間 + GC スレッド時間) となります。バックグラウンド アプリケーションや、高度な対話応答を必要としないその他のシナリオに適しています。-XX:+UseParallelGCこれはサーバー レベルのデフォルトの GC メソッドであり、指定を強制したり、スレッド数を指定したり-XX:ParallelGCThreads=4するため使用できます。
  • Parallel Old コレクター (コピー停止アルゴリズム)
    Parallel Scavenge コレクターの旧世代バージョン、スループット優先の並列コレクター。
  • CMS (Concurrent Mark Sweet) コレクター (マーク クリーニング アルゴリズム) は、
    高い同時実行性と低い一時停止を備え、最短の GC 回復一時停止時間を追求しており、CPU 使用率が比較的高く、応答時間が速く、一時停止時間が短いです。高速応答性を追求するにはマルチコアCPUが最適です。

おすすめ

転載: blog.csdn.net/m0_65431718/article/details/130295744