JVM-Java仮想マシンのメモリ管理メカニズム

Java仮想マシンのメモリ管理メカニズム

1 Javaのメモリ領域とメモリオーバーフロー例外

1.1ランタイムデータ領域

メソッド領域(方式エリア)

スレッドが共有し、クラス情報ストレージが仮想マシンにロードされた領域を、定数は、静的変数は、タイムコンパイラは、コードやその他のデータをコンパイルします。

ホットスポットGC法領域に拡張されるという理由だけで、ホットスポットにも(Permanent世代)永久世代と呼ばれるが、実際には両者は等価ではありません。

ヒープ(ヒープ)

ほとんどのアプリケーションのための最大の作品で仮想マシンのメモリ。すべてのスレッドは、共有仮想マシン啓東を作成するために、地域の作品を。ヒープの唯一の目的は、すべてのオブジェクトのインスタンスを格納することです。Java仮想マシン仕様説明:すべてのオブジェクトインスタンスと配列は、ヒープ上に割り当てられるが、JITコンパイラ技術の成熟し、エスケープ分析、スタック上に割り当て、スカラー交換の開発を、最適化技術は、いくつかの微妙につながります変更は、すべてのオブジェクトがヒープに割り当てられているので、もはや「絶対。」

Javaヒープは、多くの場合、「GCヒープ」(ガベージコレクションヒープ)と呼ばれる、ガベージコレクタによって管理されるメインエリアです。回復メモリから、サブバンドコレクションアルゴリズムの主な用途ので、スタックは2歳に細分化され、新しい世代は、その後、サバイバー領域へサバイバー領域から、その後、細かいエデンの領域があります。メモリ割り当ての観点から、複数のスレッドがプライベート分離することができるバッファ(スレッドローカル割り当てバッファ、TLAB)を割り当てます。

仕様、物理的、論理的に連続した不連続なヒープ領域。実装された場合、-Xmx制御を通って-Xms拡張することができる、固定された大きさにすることができます。ヒープが割り当てオブジェクトのインスタンスを完了するための十分なメモリではなく、ヒープを拡張することができない場合は、OutOfMemoryErrorがスローされます。

仮想マシンのスタック(VMスタック)

プライベートスレッド、同じスレッドのライフサイクルを。Javaメモリー・モデル記載の方法を行う仮想マシンのスタックがある:各メソッドは、同僚が店舗情報ローカル変数テーブル、オペランドスタック、動的リンク、方法輸出するために使用されるスタックフレームを行う作成します。多くの場合、そのスタックの仮想マシンのメモリが言われています。

どちらの例外:スタックは、仮想マシンの許容深さによって要求されたスレッドの深さよりも大きい場合は1、スローにStackOverflowError例外を、2のOutOfMemoryErrorには適用するのに十分ではないメモリがスローされた場合、仮想マシンのスタックが動的に拡張することができます。 。

ネイティブメソッドスタック(ネイティブメソッドスタック)

ネイティブ仮想マシンを使用する場合に、サービスへの方法(バイトコード)サービス、ネイティブメソッドスタックを実行するために、スタックのJava仮想マシンは、また民間のスレッドだけでなく、上記の2つの例外の規定を。

プログラムカウンタ(プログラムカウンタレジスタ)

それは、現在のスレッドによって実行される行番号指示子バイトコードとして認識されるであろう。各スレッドは、それぞれに帰属プログラムカウンタ有するプライベートスレッド、メソッドがネイティブメソッドを行った場合、PCR値がヌルであるが、本明細書において、領域はOutOfMemoryErrorがありません。

ランタイム定数プール(定数プールを実行しています)

実行時定数プールに属するメソッド領域その一部。クラス、フィールド、メソッド、およびインターフェース記述情報に加えて、クラス・ファイルのバージョン、定数プール(定数プールテーブル)があり、この部分では、コンパイル時に発生する種々のリテラルの符号を記憶しますストレージの時定数プールにクラスローディング方式に実行した後。

定数プールは、メモリには適用できない場合メソッド領域によるメモリの制限は、OutOfMemoryErrorのがスローされます。

 

1.2オブジェクトの作成

作ります

注:ここに記載の配列を含んでおり、クラスオブジェクトのオブジェクトはありません。

1.命令はこの参照によって表されるクラスは、ロードされ解析され、初期化されているかどうかを確認するために、新しいキーワード、参照シンボルクラスの定数プールがあるかどうかを最初にチェックし、検出された場合。ない場合は、クラスのロード処理を行います。

2.新しいオブジェクトのメモリを割り当て、その後、積載クラスによって確認されました。分布二つのタイプに分ける:1)ポインタ衝突:ヒープメモリ立体規則を仮定し、即ち、使用メモリの側に、メモリコントローラは、ラインの反対側に、中間の境界点インジケータ手として立っていました、分配は、自由空間の可動部の側に向けられたときに物体距離の大きさに等しいです。2)フリーリスト:メモリが構成されていない場合は、ポインタの衝突、使用することはできません。VMは、メモリ・ブロックが用意されていたレコードのリストを維持し、リストからオブジェクトのインスタンスに割り当てられた大規模な十分な空きメモリを見つけるための時間の割り当て、リストを更新します。

二つまたは同時非スレッドセーフの場合より配信。二つの溶液:1)メモリ空間に割り当てられた同期の動作、すなわち、CAS +を使用して、障害リトライアトミック更新操作を保証し、2)メモリ割り当て動作において異なるスレッド分割領域を、すなわちによれば、各スレッドをローカルスレッド割り当てバッファ(TLABをLoacal割当バッファスレッド)のみTLABがなくなって、新しいTLABを割り当てたスレッドTLABに割り当てられたメモリを割り当てるためのスレッドのニーズ - Javaで事前に割り当てられたヒープメモリの小片同期がロックされている場合のみです。-XXによるかどうかTLAB、:+/- UseTLABパラメータ設定。

3.メモリ割り当てが完了すると、割り当てられたメモリ空間は、(オブジェクトヘッダを含まない)がゼロの値に初期化されます。あなたがTLABを使用している場合、この操作はTLABに事前に行うことができます。オブジェクト・インスタンスが初期値は、直接ゼロ値に対応するフィールドへのアクセスを与えることができるされていないと、この動作を確実にします。

オブジェクトは、クラスのインスタンスであるようなどのようにVMオブジェクトの設定は、このようなメタデータ、オブジェクトのハッシュコード、被験者のGC世代年齢、およびその他の情報付勢ロックなどの情報を見つける方法現在の動作状態で有効になって、これらオブジェクトヘッド(オブジェクトヘッダ)内の情報。

レイアウト

頭部オブジェクト(オブジェクトヘッダ)、インスタンスデータ(インスタンスデータ)とアライメントパディング(パディング):ホットスポットでは、メモリ・レイアウトに記憶されたオブジェクトは、3つの領域に分割されます。

1.オブジェクトヘッド

オブジェクトヘッダは、2つの情報を含みます。

1)マークワード:ランタイム・データは、ハッシュコード(ハッシュコード)として、それ自体をオブジェクト記憶、GC世代年齢ロック状態フラグスレッドはロック、スレッドIDバイアス、バイアスのタイムスタンプを保持します。表1に示すように大きいため、実行時データに、それは、ストレージスペースを多重化します

表1

メモリ内容 状態
オブジェクトのハッシュコード、オブジェクト世代年齢 01 ロック解除
ポインタ記録 00 軽量ロック
ヘビー級のロックを指し示すポインタ 10 膨張(重量ロック)
レコードに空の、必要はありません 11 GCマーク
バイアススレッドID、タイムスタンプバイアス、オブジェクト世代年齢 01 偏ります

 

2)タイプポインタ:そのクラスのメタデータであるオブジェクトへのポインタ、オブジェクトは、クラスのインスタンスであるポインタによって決定することができます。いないすべての仮想マシンの実装は、型のポインタを持っています。

注:オブジェクトは、Java配列時間は、配列の最初のデータ・レコードの長さのためにターゲットが存在しなければなりません。

データの2例

情報記憶部は、有効なオブジェクト、プログラムコードで定義されたフィールドのコンテンツタイプの、すなわち、各部分です。親クラス、サブクラスの定義から継承含みます。

それを埋める3

それは必ずしも存在しない充填、のみプレースホルダで役割を果たしています。

HotSpot VMのオブジェクト開始アドレスがデータインスタンスを整列されていない8バイトの整数倍であるため、充填されます。

 

1.3ポジショニング訪問

使用して主に二つの方法、ハンドルの直接のポインタを。

1.ハンドル:Javaヒープメモリプール・ハンドルに分割されるように、Javaのスタックハンドラ・アドレスがローカル変数に格納された参照テーブルに格納され、その後、ハンドルアドレスは、オブジェクトインスタンスデータおよびオブジェクトタイプデータの各特定情報に含まれます。

2.直接ポインタ:部分を処理しない、オブジェクトインスタンスのデータおよびオブジェクトタイプのデータに直接格納されたアドレス参照。

直接ポインタが開口部の速度であり、ハンドルのように余分ながない。基準が安定したハンドラ・アドレスに格納されているため、ハンドルは、オブジェクトの移動は、ハンドルポインタの唯一の変化は(ガベージコレクタの移動は、通常動作と普遍的です)ポジショニング。

 

前記ガベージコレクタとメモリ割り当て戦略

2.1オブジェクトが死んでいる方法を決定しますか?

リサイクルのためのガベージコレクタヒープの前に、まずすべてのオブジェクトは、オブジェクトは、主に二つの方法により、「死んで」となっていた、「生きている」まだであるかを決定します。

1.参照カウント(参照カウント)

その場所への参照カウンタがインクリメントされるたびに、オブジェクトのカウンタへの参照を追加し、オブジェクトがされたことを示す、故障、一つのカウンタ値、カウンタ値が0に言及する場合、「死にました」。

長所:シンプル、決意効率、効率的で時間の最も効果的。

短所:困難なオブジェクトの問題の間で循環参照を解決します。

前記到達可能性分析アルゴリズム(到達可能性分析)

このアルゴリズムはまた、Javaで使用されています。

基本的な考え方:  一連のオブジェクトがGCのルーツへの参照を持たない検索パス横断基準鎖(参考鎖)と呼ばれる出発点として、「GCルーツ」オブジェクト、これらのノードから下方に検索を開始する、となりますチェーンが接続されている場合、オブジェクトが使用できないことを証明します。

:を含むGCルーツジャワ、静的クラスオブジェクト、オブジェクトメソッド、一定の基準領域、ローカルJIN処理(一般的に呼ばれるメソッド領域属性参照で参照対象の仮想マシンスタック(ローカル変数テーブル・スタック・フレーム)ネイティブメソッド)オブジェクト参照。

リファレンスレベル

強い参照(強い参照)、そのようなオブジェクトOBJ =新しいオブジェクトとしてコード流行は、()、限り、参照は依然として強いように、ガベージコレクタは、参照回収されることはありません。

ソフト参照(ソフト参照)は、なくだけでなく、必要なオブジェクトと、いくつかを説明します。システムがメモリオーバーフロー例外が起こるために起こっている前に、第二のリサイクルによって参照ソフトのオブジェクトを持っています。メモリの回復が十分ではありませんした後ならば、それはメモリ不足の例外がスローされます。SoftReferenceクラスを実装しました。

弱参照(弱い 参照)は、また、ガベージコレクタジョブは、かどうかに関係なく十分なメモリの、あろうと、次のガベージコレクションが発生するまで、唯一の参照ソフトオブジェクトが生き残るために、非必須オブジェクトを記述するソフトよりも弱い強度を挙げリサイクル。実装弱い参照クラス。

仮想基準(ファントム参照)、また、ゴースト又はファントムとしても知られているが、引用文献最も弱い引用しました。完全に彼らの生存期間に影響を与えないだろうしているファントム参照オブジェクトがあるかどうか、ファントム参照オブジェクトのインスタンスによって達成することができません。提供される仮想参照オブジェクトに通知し、回復されます。実装PhantomReferenceクラス。

到達可能性分析、参照のないGCルーツチェーン初めて接続したときのために、最初のタイムマークのために、そうでない場合はファイナライズ()メソッドまたはファイナライズ()メソッドは、オブジェクトがすぐに宣告されない、VMが起動されています第二のマークの直後の二回目の到達可能性分析を回復することはありません死は、その後回復しました。ファイナライズ()メソッド場合は、キューF-キューに配置され、その後で実行されるファイナライザスレッドを回収します。

復旧プロセスエリア

(ホットスポット)永久世代別ガベージコレクタは、主に次の2つのカテゴリーのコンテンツ回復する:廃棄物の定数無用のクラスを。

放棄された定数:定数をオブジェクト参照定数プールがある場合に回復が、この時、必要に応じて、定数が回収される時に発生した場合、これらのリテラルへの他の参照はありません。シンボル他のクラス(インターフェイス)、メソッド、定数プール参照のフィールドも同様です。

役に立たないクラス: 3つの条件を満たすために。1)クラス内のすべての力、すなわち、クラスの任意のインスタンスのスタックが存在しない場合、回収された; 2)クラスのクラスローダをロード回収された; 3)クラスオブジェクトに対応する任意の場所のjava.lang.Classを有していません任意の場所でクラスにアクセスすることなく、反射法によって参照されます。

 

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

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

マーク - スイープは、最も基本的なコレクションアルゴリズムです。アルゴリズムは「マーク」と「クリア」2つの段階に分けています。

タグ:すべてのオブジェクトが必要なマークがリサイクルするには、すべて統一されたオブジェクトが完了した後にマークでマークされて回復しました。

クリア:ラベルされたオブジェクトの回復操作。

後続のコレクションアルゴリズムは、アルゴリズムの欠点を改善し、思考のこの列車に乗ることです。

未満: 1)効率、二つの段階が十分に高くないマーキングおよび除去効率、クリア後2)マークは、個別のメモリの断片化の多くを生成します。

2.コピーしたアルゴリズム(コピー)

住所効率の問題。メモリ容量は、一方のみを使用する2つの等しい大きさによって分割されます。使用後のメモリの一枚は、その後、別の1、もともとクリーンアップするために使用されている作品に生きているオブジェクトをコピーする場合。

かかわらず、ゴミの問題の、単純にヒープの先頭にポインタを移動し、あなたが順番にメモリを割り当てることができます。しかし、唯一元のメモリの半分を使用し、メモリ使用率が高く十分ではありません。しかし、時に高い生存率と、オブジェクト、コピー操作は効率が低下します。

それぞれのために、メモリのより効率的な使用にエデンとサバイバーサバイバーにライブオブジェクトをコピーし、1:1:メモリは、3つの部分エデン、サバイバー、サバイバーに、8の比に分割されます。スペースが十分でないときサバイバーに、それは古い時代に移動されます。

3.マーク - 仕上げ(マーク・コンパクト)

よると、古いのは同じで明確なマーカーが、その後の手順は、直接クリーンアップするオブジェクトをリサイクルしますが、最後に移動し、すべての生きているオブジェクトを聞かせて、直接外部メモリ末端境界うち最終的にクリーンされていない-特性、ラベリングとマーキングプロセス。

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

メモリの生存期間が数個に分割され、誰によって。新世代と古い時代に一般的にJavaヒープ、各時代の特徴に基づいて、最も適切なコレクションアルゴリズム。

新生代「死んだ」オブジェクトの大量があるたびにガベージコレクションは、直接使用することができ、複製アルゴリズムコレクションを完了するには、ライブオブジェクトの複製コストの少量しか。

対象の高い生存率に起因して、「セキュリティ」のための余分なスペースがない(例えば入力するための十分な時間と遺族古い、保証するために、遺族の部分がように古い)、使用マーク-スイープマークを-クリーンアップのアルゴリズムを。

 

2.3ガベージコレクタ

ガベージコレクタは、ガベージコレクションのアルゴリズムの実装です。

 

 それらが使用されてもよいことを示す、2つのコレクタの間に接続がある場合、7種類以上の図は、異なる世代コレクタに作用します。エリアは、コレクタのコレクタまたは古いの新しい世代に属していることを示しています。

1.シリアルコレクター

シングルスレッドコレクタ、仕事は収集が終わることを知って、他のすべてのワーカースレッドを一時停止しますコレクター。世界を--stop。

VMはまだで実行されているクライアント・モードのコレクターの新世代下のデフォルト。

他のコレクターと比べて簡単かつ効率的

2. ParNewコレクタ

シリアルコレクタのマルチスレッド・バージョン、シリアル・コレクタ間の唯一の違いです。

現在のCMSコレクタの作業を一緒用としてコレクターの新世代の選択肢のVMサーバーモード、。

ガベージコレクタに平行並行

パラレル(並列):パラレルガベージコレクション内のスレッドの数を意味するが、この時間は、ユーザスレッドは待機状態のままです。

並行処理(同時)が:ユーザスレッドガベージコレクタスレッドが実行(必ずしも、平行で交互に行われるわけではない)、ユーザプログラムの実行を継続し、別のCPU上で実行中のガベージコレクションプログラムを指します。

3.パラレル清掃をコレクタ

コピーコレクタアルゴリズムを使用し、コレクターの新しい世代であり、並列、マルチスレッドコレクタ。

特徴:CMSのユーザスレッドガベージコレクションの懸念コレクタはできるだけ短くしているの休止時間、およびパラレルスカベンジ目標は、制御のコレクタに到達することですスループット(スループット)。

スループット:ああCPU時間を有するユーザと縦時間消費の比率を実行するためのCPU。

スループット=時間/(時間+時間のガベージコレクションを実行しているユーザコード)を実行しているユーザコード。一般的には、ガベージコレクタが1分、次いで99%のスループットを費やし前記VM 100分、実行します。

したがって、また、「スループット優先」コレクタとして知られています。

4.シリアル・オールド・コレクタ

コレクターのシリアル古いバージョンがあり、コレクタが使用して、シングルスレッドでソート-マークアルゴリズム。

使用のメインモードでクライアント仮想マシン。

5.パラレルオールド・コレクタ

、古い古いパラレルスカベンジコレクタのバージョンである並列使用マーク-ソートアルゴリズム。

主にパラレルスカベンジコレクタを使用しました。

6. CMSコレクタ(並行マークスイープ)

最短目標復旧時間のためにコレクタを一時停止します。

いくつかのサーバー側のインターネットのほとんどのJavaアプリケーションまたはB / Sシステム、そのようなアプリケーションどこ応答サービスは、システムがユーザーに優れた体験を提供するために、最短時間を一時停止します。CMSは、この要件を満たしています。

ベースのマーク-スイープアルゴリズムを実現しています。

実行プロセスは、2つの段階に分かれています。

1)初期のマーク(CMS初期マーク)のみオブジェクトのGCのルーツをマーキングストップザ・ワールドの必要性は、直接速度にリンクすることができます。

2)同時マーク(CMS並行マーク) GC RootsTracingプロセスのため、

3)発言は、(CMS発言)必要StopThe世界は、並行マーク中に補正するために、ユーザプログラムが実行され、初期マークフェーズよりも少し長く、オブジェクト生成された記録マーク部分の著しい変化にリードし続けますが、ので、コンカレントマークフェーズよりも短い時間。

4)同時クリア(CMS同時スイープ)

利点:とも呼ばれる同時収集、低休止、同時ポーズコレクタ(一時停止コレクタ同時低)

短所: 1)CPU + 3の数)/ 4回復スレッドのCMSのデフォルト数のスレッド同時ごみが(起動時にCPUリソースに非常に敏感である; 2 ) 浮動ごみ(浮遊ごみ)を扱うことができない、「同時モード故障」が表示されることがあり別のフルGCにつながっ障害が生じ; 3)の結果に基づいてマーク-スイープコレクターアルゴリズムは、デフラグ、あなたはゴミを分類してUseCMSCompactAtFullCollection CMSFullGCBeforeCompactionを設定することができますすることはできません。

ゴミフローティング:プログラムと一緒に、まだクリーンアップ段階を実行しているCMS同時ユーザースレッドが、新しいスパムランを生成します、ごみのこの部分は、マーキング工程の後に表示され、CMSは、コレクション、GCが再び左下で行われている時間でそれらを扱うことができませんクリーンアップ。

7. G1コレクタ(ガベージ・ファースト)

それはのためにあるサーバーのガベージコレクタアプリケーション。

特長:

1)平行と同時には:一時停止する時間を短縮し、環境に停止ザ・ワールドへの複数のCPUを使用するマルチCPU、マルチコアハードウェアの利点を活用します。

2)世代のコレクション:世代概念はまだG1に残ります。

3)空間的統合: GLは全体から計算されたマーク-仕上げ(ビュー)領域との間の局所からコレクタアルゴリズムは、に基づいて、複製アルゴリズム実装します。

4)予測可能なポーズ:滞留時間を減少させるでユーザが明示的にガベージコレクタで消費Mミリ秒のタイムスライス内の長さを指定することを可能にするCMS及びG1、予測可能な停止時間モデルの確立を介してG1の共通の懸念Nミリ秒を超えてはなりません。

4つのステップに分割動作G1コレクター:

1)初期ラベル(初期)はマーキング、GCのルーツをする必要性にのみ直接リンクできるオブジェクトをマークしたスレッドを停止し、より短いです

2)同時マークマーキング(並行)は、 GCのルーツから到達可能性解析オブジェクト、ライブオブジェクトを見つけ、時間がかかり、ユーザーがプログラムすることができますヒープに始まった同時実行を。

3)最後のマーク(最終マーキング)、により生成された記録マークの部分の著しい変化をもたらし、ユーザプログラムの継続動作に並行マーク中に改正され、あなたがする必要があるスレッドが並列に実行することができます停止

4)、回復(ライブデータカウントと避難)をスクリーニングするユーザに応じてリサイクルプログラムを開発し、ソートする各領域の値とコストを回収するためにGCの一時停止を所望する、ユーザプログラムもすることができ、同時に実行されます。

 

 

 

 

2.4オブジェクトの割り当てと回復の戦略

メモリの割り当てと回復のオブジェクトへのオブジェクトに割り当てられたメモリ:最後の自動メモリ管理に提唱したJava技術システムは、自動化のための二つの問題を解決するために起因することができます。

1. 对象优先分配在Eden区,大多数情况,对象在新生代Eden区中分配,当Eden区空间不足够的时候回发生Minor GC。

Minor GC和Full GC区别:

新生代GC(Minor GC):指发生在新生代的垃圾收集动作,Minor GC较为频繁,因为Java对象朝生夕灭的特性,回收速度也快;

老年代GC(Major GC/Full GC):指发生在老年代的GC,出现Major GC时经常会伴随至少一次Minor GC(但非绝对,在Parallel Scavenge收集器上的手机策略里有直接进行Major GC的过程)。Major GC速度一般比Minor GC慢10倍以上。

2. 大对象直接进入老年代

大对象:需要大量连续内存空间的Java对象,比如长字符串和数组。

3. 长期存活的对象将进入老年代,VM给每个对象定义了一个对象年龄(Age)计数器,每进过一次Minor GC计数器加1,年龄达到一定程度度(默认15岁),就进入老年代咯。通过参数MaxTenuringThreshold设置。

4. 动态对象年龄判断,如果Survivor空间中相同年龄所有的对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无需叨叨MaxTenuringThreshold所要求的年龄。

5. 空间担保分配,发生Minor GC前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间,如果该条件成立,那么Minor GC是确定安全的;如果不成立,虚拟机会查看HandlePromotionFailure设置是否允许担保失败。如果允许,那么继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次Minor GC,尽管该操作有风险;如果小于或是HandlePromotionFailure设置不允许,就改为Full GC。

 

参考《深入理解Java虚拟机(第二版)》所写。

 

おすすめ

転載: www.cnblogs.com/baishouzu/p/12312864.html