JVM動的メモリパーティションとガベージコレクションアルゴリズム

JVM動的メモリパーティションとガベージコレクションアルゴリズム-「Java仮想マシンの詳細な理解」の概要を読む

ランタイムデータの動的管理を実現するために、Java仮想マシンは一連のメモリ管理メカニズムを実装します。最初に、ランタイムメモリが分割され、メモリ分割の概念モデルが指定され、特定の領域にガベージコレクションアルゴリズムが提供されます。そのため、Javaプログラマーはメモリー管理の詳細を気にする必要はありませんが、すべてに長所と短所があります。メモリー処理に関連する問題がある場合、問題を素早く見つけて解決できるように、基礎となる実装の詳細を理解する必要があります。

:本論文では、三つの部分を説明
- ランタイムメモリゾーニング
- オブジェクトストレージとアクセス
- ガベージコレクションのアルゴリズムを


ランタイムメモリ領域の分割

この記事で言及されているメモリ領域の区分は、JVM仕様の概念モデルの概要であり、HotSport仮想マシンの実装など、JVM実装製品によって異なる場合があります。メソッドスタックは均一に実装されます。

JVMメモリパーティション
以前考えていたものとは異なり、メモリは単にヒープとスタックの2つの部分に分けられます。この図からわかるように、JVMランタイムデータ領域は、プログラムカウンター、仮想マシンスタック、ローカルメソッドスタック、Javaヒープ、メソッド領域の5つの部分に主に分かれています。詳細は以下の通りです。

  1. プログラムカウンタは、
    行番号インジケータ、メイン実行フロー制御命令として理解することができる、それは基本的な配列、鎖状、分岐状、環状3つのフローステートメントを実行することです。各プロセッサは一度に1つのスレッドで特定の命令しか実行できないため、各スレッドは現在のスレッドのプログラムカウンタを保存する必要があります。

  2. VMスタック
    スタックを介してユニットとしてスタックフレームへの各メソッド呼び出しのため、スタック操作実装プロセスメソッド呼び出し。スタックフレームには、ローカル変数テーブル、オペランドスタック、ダイナミックリンク、メソッド出口などの情報が格納されます。

  3. ネイティブメソッドスタック
    の仮想マシンスタックと役割が、使用のためのネイティブメソッドスタック主にネイティブメソッド。

  4. ヒープは、
    主に新世代と古い時代に分割ガベージコレクション方式によれば、データ・オブジェクトおよび配列を格納するために使用される、新生代はエデン、FromSurvior、ToSurviorに分割されています。他の分類方法もあります。たとえば、メモリ割り当ての観点から、複数のスレッドプライベート割り当てバッファーTLAB(スレッドローカル割り当てバッファー)に分割できます。さらに、ホットスポット仮想マシンは、メソッド領域をJavaヒープメモリに配置し、永続的な世代で管理します。メソッド領域のガベージコレクションメソッドについては書き込みが少なくなりますが、効果は十分ではありません。

  5. メソッドの地区
    クラス情報の格納方法、仮想マシンの負荷のメインエリア、定数プール、静的変数は、タイムコンパイラは、コードやその他のデータをコンパイルします。

さらに、図でマークされているダイレクトメモリは、JVM仕様で定義されているメモリ領域ではありませんが、JVMはNIO呼び出しのローカル関数ライブラリを介してオフヒープメモリにアクセスし、呼び出し効率を向上できます。この部分は、JVMのメモリサイズによって制限されませんが、それでもマシンの合計メモリサイズによって制限されるため、Javaプログラムのメモリを分割するときに、マシンのすべてのメモリを占有することはできません。メモリのこの部分のニーズを考慮する必要があります。


オブジェクトの作成とアクセス

主に、オブジェクトのストレージ構造、作成プロセス、アクセス方法が含まれます。
オブジェクトの作成とアクセス

オブジェクトは主にヒープメモリに格納され、その作成プロセスは主に5つのステップに分かれています
。1。クラスがロードされているかどうかを確認し、ロードされていない場合は、クラスのロードプロセスを実行します。クラスのロードが完了したら、オブジェクトのメモリサイズを決定できます
。2メモリを割り当てる、メモリ領域が規則的であるかどうかに応じて、「ポインタ衝突」(バンプポインタ)と「フリーリスト」(フリーリスト)の2つの方法に分けられます。ポインタ衝突針は、メモリ規制がメモリポインタを移動するだけなので、メモリ分割を指しますちなみに、フリーリストとは、レコードテーブルを通じてメモリブロックの使用状況を記録する方法を意味します。メモリ領域が正規であるかどうかは、ガベージコレクションアルゴリズムによって決定され
ます。3。値0を初期化しますこれは、オブジェクトの作成後に属性がデフォルト値になる理由です
。4。オブジェクトヘッダーを設定し、オブジェクトのさまざまな状態に従ってオブジェクトのランタイムデータを設定します。
5. Javaクラスのinitメソッドを実行します。

オブジェクトが作成された後、メモリ内のそのデータ構造には、主にオブジェクトヘッダーとクラスポインター情報が含まれます。オブジェクトが配列の場合、配列の長さのデータも格納する必要があります。

オブジェクトアクセスメソッドは、ハンドルとダイレクトポインターに分かれています
。1.ハンドルアクセス:ハンドルプールは、Javaヒープで分割されます。スタックスペースのローカル変数テーブルの参照型変数は、ハンドルを指します。ハンドルには、オブジェクトのアドレスとメソッド領域が含まれます。タイプデータのアドレス。
2.直接ポインタ:参照型変数は、ヒープ内のオブジェクトメモリのアドレスを直接指し、型データのアドレスはオブジェクトに格納する必要があります。
どちらの方法にも独自の長所と短所があります。オブジェクトを移動する操作の場合、handleメソッドはハンドルが格納されているアドレスを変更するだけで済みます。参照データを変更する必要はありませんが、より多くのメモリを占有し、オブジェクトにアクセスするときのポインター配置のオーバーヘッドを追加します。直接ポインタメソッドの方が効率的ですが、型データにアクセスしたりオブジェクトを移動したりするときは、より多くの操作が必要になります。HotSpotは直接ポインターアクセスを使用します。


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

ガベージコレクションはJavaよりも前に提唱され、この部分には主に3つの質問が含まれます。いつリサイクルされますか?リサイクルするには?
ガベージコレクションアルゴリズム

どのメモリが解放されますか?

到達可能性分析アルゴリズムは、オブジェクトが生きているかどうかを判断する目的でJavaで使用されます。Javaは、GCルートと呼ばれる一連のオブジェクトノードからオブジェクトの列挙を開始します。トラバースされるパスは、「参照チェーン」と呼ばれます。オブジェクトがGCルートに到達した場合参照チェーンが接続されていない場合、オブジェクトはリサイクル可能であると判断されます。
参照と参照なしに加えて、オブジェクト間の参照にはいくつかの中間状態があります。参照型はJDK 1.2から拡張され、システムでのキャッシングのアプリケーションと同様に、「食べ物の味がなく、あきらめるのが恥」の状態にあるいくつかのオブジェクトを記述しています。強から弱への参照強度に応じて、4つのタイプに分類されます。異なるタイプの参照の到達可能性分析およびメモリ回復を実行する場合、これらは異なる方法で処理されます。
1.強い参照:Object obj = new Object();のように存在する一般的な参照を参照します
。2.ソフト参照:非必須オブジェクト、それらに関連付けられたオブジェクトは、メモリオーバーフロー例外が発生する前に2回リサイクルされます。 JDKはSoftReferenceクラスの実装を提供します。3
。弱い参照:重要でないオブジェクトについても説明します。次のガベージコレクションでは、メモリが十分かどうかに関係なく、参照オブジェクトはリサイクルされます。JDKはWeakReferenceクラスの実装を提供します
。4。仮想参照:オブジェクトのライフサイクルこのクラスの参照オブジェクトのガベージコレクション中にシステム通知を受け取ります。JDKはPhantomReferenceクラスの実装を提供します。

到達できないオブジェクトの場合、存続の可能性があります。ガベージコレクションの2つのマーキング中に、最初のマーキングに対してフィルタが実行されます。オブジェクトがfinalize()メソッドを書き換えると、F-Queueキューに追加されます。 JVMは、自己構築された、優先度の低いFinalizerスレッドを介して実行されます。オブジェクトのfinalize()メソッド自体がGC Roots参照チェーンを参照している場合は、リサイクルを回避できますが、JVMはfinalize()メソッドが正常に実行できることを保証しません。このメソッドは、Javaが生まれたときのJava C ++開発者専用です。それを受け入れる方が簡単です。

いつリサイクルされますか?

STW(Stop The World):この名前はクールに聞こえますが、良いことではありません... JVMがルートノードを列挙するときのオブジェクト間参照の必要性を示します(到達可能性分析におけるGC Roots参照チェーンの決定)一貫性のある状態を維持します(たとえば、オブジェクトが作成されたばかりで、その参照型変数に関連付けられていません。現時点では、アクセシビリティ分析を実行して、それをリサイクル可能なオブジェクトとして識別することができます...)。すべてのJava実行スレッドを停止することをSTWと呼びます。
HotSpot仮想マシンでは、OopMapデータ構造を使用して参照関係を格納し、正確なGCを実現します(JVMはメモリロケーション内の特定のタイプのデータを認識しているため)。コンテキスト全体とグローバル参照ロケーションを確認する必要はありません。OopMapに変更をもたらす多くの命令があります。JavaスレッドがSafePointに実行され(安全点-プログラムが長時間実行できるようにする機能がある)、OopMapデータが一時的に修正された場合にのみ、GCを実行できます。これらの場所には、メソッド呼び出しやループジャンプが含まれます。 、異常ジャンプなど
安全なポイントでプログラムを停止する方法は2つあります。プリエンプティブ割り込み、アクティブ割り込み、プリエンプティブ割り込みは、JVMがすべての実行スレッドを直接停止することを意味し、安全なポイントにスレッドがない場合は復元されます。安全なポイントまで続行してから停止します。アクティブな割り込みは割り込みフラグを設定することであり、各スレッドは実行時にこのフラグをポーリングします。フラグがtrueの場合、割り込みは中断されます。
SleepまたはBlocked状態のスレッドは、JVM割り込み要求に応答できず、安全なポイントまで実行されません。現時点では、SafeRegion(セーフ領域-コードスニペット、参照関係は変更されません)を使用する必要があります。スレッドがこのコードに入るときその時点で、それはそれ自体が安全領域に入ると識別し、JVMはSafeRegionのスレッドに関係なくGCを開始します。スレッドがSafeRegionを離れるとき、ルートノードの列挙が完了したかどうかを確認する必要があります。その後、完了後に終了できます。

リサイクルするには?

  1. マークは-スイープ
    他の二つは、このアルゴリズムに基づいており、それは最も基本的なコレクションアルゴリズムです。アルゴリズムは、マーキングとクリアの2つのステップに分かれています。リサイクルするメモリを決定するとき、リサイクルするオブジェクトをマークするためにマーキングプロセスが2回言及されます。マーキングが完了すると、リサイクルされるオブジェクトはクリアされます。実行効率が低く、メモリが断片化しやすいという問題があります。

  2. コピー
    効率化のための後には、メモリ領域アルゴリズム複製はスペースエデンに分けて、2つの小さなサバイバーエリア、唯一のエデン、サバイバー・メモリ領域とそれぞれ、ガベージコレクションは、範囲のサバイバー内の別のものにライブオブジェクトをコピー、生き残ったオブジェクトが別のサバイバーメモリ領域よりも多くの領域を占める場合、保証されたメモリ範囲に割り当てられます(HotSpotは特に古い世代を指します)。
    複製アルゴリズムの生存率が高い場合、複製効率は低く、保証するために追加のメモリ領域が必要ですこの特性は、新世代のメモリリサイクルに適しています。

  3. マーク-仕上げ
    ラベリング処理及び方法マーク-仕上げ工程としてスイープアルゴリズムは、ライブオブジェクトの末尾に移動することとなり、直接クリーンアップの境界外のオブジェクト、古い時代のメモリの断片化の問題を解決します。

HotSpot仮想マシンのガベージコレクターは、ガベージコレクションアルゴリズム、同時実行性、および並列処理の特性に従って分類されます。ここでは紹介しません。

まとめ

この記事では、Java仮想マシンのランタイムメモリの概念モデルの詳細を紹介し、オブジェクト作成プロセス、オブジェクトデータ構造、およびヒープメモリ内のアクセス場所について詳しく説明します。最後に、ガベージコレクションアルゴリズムについて、どのオブジェクトをいつ、どのようにリサイクルするかについて説明します。これらのコンテンツを完了すると、JVMのメモリ構造とガベージコレクションについて理論的に理解できます。これらの理論と原則は、さまざまなガベージコレクタにあります。 JVMパラメータは、さまざまな構成やその他の条件で固定されていません。実際の状況に応じて、それらを理解して適用する必要があります。

元の記事を159件公開 賞賛された225件 210,000回の閲覧

おすすめ

転載: blog.csdn.net/lyg673770712/article/details/80837046