Javaのガベージコレクションとメモリの割り当て

Javaのガベージコレクションとメモリの割り当て

グラフTB A [ごみ] B [研究生活] C [参照カウント] D [到達可能性分析] E [4つの参照] F [GCルーツ] G [回数字] H [コレクションを拒否] I [回収3] J [確定] K [<B>世代</ B>] L [<B>歳</ B> <BR/>タグ - 仕上げマーカー - クリア] M [<B>新生児> BB - - > CB - > DD - > ED - > FA発生が</ B> 118] N [ホットスポット<BR/> OopMap <BR/>下記参照] Aをコピー<BR/> - > GG - > HG - > IH - > JG - > KK - > LK - > MG - > N

[TOC]

生活のオブジェクト

クリーニングが必要なオブジェクトを見つける目的を生きるのオブジェクト

住んでいる共通参照カウント法と到達可能性解析の対象。(C ++のスマートポインタと同様の参照カウント法shared_ptr質問)生活の目的は、比較的容易に達成するが、例えば、各オブジェクト参照との間の循環を解決することはできません

class A{
	public A element;
	...
}

A a, b;
a.element = b;
b.element = a;

GCのルーツ

Javaの、到達可能性解析やGCのルーツは、密接に関連しています。Javaはオブジェクト指向言語、参照アソシエーションを使用して、すべてのオブジェクト(実装がポインタでC / C ++であってもよい)です。ソフトウェアの先頭から開始し、すべての関連するオブジェクトは、すべてのオブジェクトが(PODに加えて、植物古いデータ)親オブジェクトによって作成され、「親」になります。Javaはオブジェクトを初期化する主な機能に入る前に始めたではなく、その親のJVMであると考えられ、主な機能を入力した後に作成されたすべてのオブジェクトは、親オブジェクトが主な機能は存在していると考えることができます。これは、Java内のすべてのオブジェクト間の関係が複数のツリーを使用して発現させることができる示し、これらのツリーのルートは、ガベージコレクションのスキャンのための出発点であり、GCルーツであります

すべてのオブジェクトの親はなく、出発点として、JVMをさかのぼることができたときにJVMのガベージコレクション

GCのルーツは、一般的に次の4つのカテゴリがあります。

  1. VMのスタック参照オブジェクト
  2. メソッド地区の静的プロパティを参照しているオブジェクト
  3. メソッド地区一定の基準オブジェクト
  4. ネイティブメソッドスタックJNI(Javaネイティブ・インターフェース、ネイティブ方式)の参照オブジェクト

リファレンスの分類

ジャワ1.2は、それぞれ、強いから弱に以下の4つの文献、「基準強度」に分割されます。

  1. 強い参照

強い参照は、同様に、共通のプログラムコードを指すObject obj= new Object()限り強い参照があるように、ガベージコレクタが失われた参照されたオブジェクトを再利用しない、そのような参照

  1. ソフト参照

ソフト参照もなく、必要なオブジェクトと、いくつかを記述するために使用されています。オブジェクトに関連付けられたソフト参照は、オーバーフロー例外前にシステムメモリに行われるため、これらのオブジェクトが回復回復の範囲内の第二のように表示されます(SoftReference関数を使用して作成することができます)

  1. 弱参照

弱参照は、非必須オブジェクトを記述するために使用されるが、その強度はソフト参照よりも弱い、次回のガベージコレクションは、(弱い参照)が発生するまで、関連するオブジェクトのみ生存できる弱く引用されています

  1. 偽の引用

オブジェクトに関連付けられた仮想基準を設定する唯一の目的は、オブジェクトがコレクタに回収されたときに通知システム(PhantomReference)を受信することができます

ガーベジコレクション

ガベージコレクションは、生活やメモリの統合のオブジェクトを含むことになります。GCプロセスがプロセス全体は、通常、JVMスレッドの実行を停止するのにかかるように移動物体が、参照、変更、他のスレッドで実行されていないことを確認することが困難であるため、Sunはこの問題と呼ばれますStop The World仮想マシンはとても可能な限り、ガベージコレクションの休止時間に起因するシステムを減らすために、ビジネスのパフォーマンスに影響しますスレッドの実装を中断する。のみGC休止とき、オブジェクトのハンドルを使用してオブジェクトにアクセスするには、同じスレッドの実装に関連する他のスレッドであるが、オブジェクトにアクセスするためにハンドルを使用できることは効率的ではない、そのような方法は、作業プロセスの実行に割り当てられた時間をGCであろう

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

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

メモリの生存期間が数個に分割され、誰によって。一般的にはJavaヒープに新世代(単にオブジェクトを作成するために長いを取っていなかった)と、古い年(オブジェクトがすでに大きなオブジェクトの一部はまた、デフォルト歳です、長い時間のために存在している)、あなたができるように、年齢に基づいて最も適切な機能を備えましたコレクション・アルゴリズム。たとえば、オブジェクトの新しい世代は、各ガベージコレクションでは、いくつかのライブオブジェクトは、あなたは下記のコピーアルゴリズムを使用することができます。長い時間生存年「マーク-クリーンアップ」の下に言及したオブジェクトを使用することができます古いためか、「マーク-仕上げを」アルゴリズム

マーク - クリア

特定のプロセスと、以下の処理は、2つのマークに類似している不利な点は、非効率的であり、メモリ断片化の問題が存在することになります

二つのマーカー

到達可能性分析の間にオブジェクトが参照鎖およびGCのルーツが接続されていないが見つかった場合、それは第1のマークであるとスクリーニングフィルタ条件は、それが必要である。この目的は、ファイナライズ()メソッドを実行するかどうかで実施します。オブジェクトがファイナライズ()メソッド、またはファイナライズを(被覆されていない場合)、この方法は、それ以外の場合は「実行するために必要」である「行う必要はない」と時代遅れの仮想マシン、仮想マシンオブジェクトが呼び出されました

オブジェクトがファイナライズ()メソッドを実行するために必要であると判断された場合、オブジェクトが既知で配置されるF-キュー、およびそれ以降の低優先度スレッドファイナライザによって作成された自動仮想マシンによってキューにそれを実行します。ここで、「実行」という用語は、このメソッドをトリガーする仮想マシンを意味し、それは、それは実行の終了を待つことになる約束しません。

ただで再接続する - 確定()メソッドは、中)(オブジェクトが自身の救助ファイナライズで成功するためならば、後でGCは、第2小マークにF-キューのオブジェクトになります、オブジェクトの死の運命を脱出する最後のチャンスです参照を鎖上の任意のオブジェクトに関連する、オブジェクトは、F-キューから削除され、「生きている」と考えられています

オブジェクトをファイナライズ()メソッドは一度だけ呼び出される Javaで可能finalizeメソッドな限り使用しないでください、

マーク - 仕上げ

ラベリング処理と、まだ「マーク - スイープ」アルゴリズム同じですが、その後の工程は終了境界以外のダイレクト・メモリを一掃、その後、直接クリーンアップするオブジェクトを再利用されるのではなく、すべての生存オブジェクトに最後に移動されます

コピー

使用可能なメモリ容量に基づいて、コピーアルゴリズムは、サイズが等しい2で除算され、のみそれらの1つを使用します。メモリのこの部分がなくなると、コピーはまた、メモリ空間をきれいに一度、その後、使用されている、上記の別の1にオブジェクトを存続します。各時間全体セミメモリ回収ゾーンは、移動する限り、メモリの断片化等時性メモリ割当ての複雑さを考慮しないようにスタックポインタの上部、メモリは、単純、効率的な動作を達成するために割り当てることができます。このアルゴリズムのコストは元の半分にメモリを削減することである。しかし、価格が比較的大きいです

統計的にガベージコレクションを実行する前に、話す、98%新世代のオブジェクトはリサイクル可能なので、メモリを配置する必要が二つの等しい大きさに分けされていません

回復するための以下の方法を使用して、ほとんどの市販の仮想マシンの新しい世代のオブジェクトを

メモリへのオブジェクトの98%を削除することができるのでエデン二サバイバーの10%、80%、毎時間ガベージコレクションので、ほとんどの場合、10%:HotSpotの新世代のメモリに仮想マシンが3つの分割されていますすべてのライブオブジェクトを格納します。元ガベージコレクタの仮想マシンは、エデンを使用し、サバイバー、サバイバーとエデンの回復の一つは、サバイバーで別の未使用のオブジェクトを移動するために使用されます

サバイバーがトリガーするオブジェクトの残りの部分を保存することはできません場合は割り当て保証を(ここで注意です)

回復

クラス(メソッド)3つの条件がリサイクル可能なクラス考慮する必要があります

  1. すべてのこのような場合には、回収され、
  2. ロードクラスがClassLoader回収されました
  3. クラスに対応しjava.lang.Class、どこにも参照されないオブジェクトがどこのクラスにアクセスする方法によって反射されない、すなわち

リサイクルのための方法かどうかに、仮想マシンは、設定オプションを提供します。反射、動的プロキシ、多数の用途においてCGLibByteCodeフレーム、および動的に生成されたJSPカスタムOSGiのような頻繁なClassLoaderシナリオでは、静的がオーバーフローでないことを保証するために、仮想マシンベースのアンロード機能を持っている必要が

ホットスポット&OopMapガベージコレクションを実装

グラフLR A [ホットスポット&OopMap] B [&正確保存] C [セキュリティゾーンのセキュリティドット] D [&プリエンプションアクティブ] E [回収実装] F [、シリアルParNew、<BR/>パラレルCMS、シリアル古いです、パラレルオールド<BR/> G1] I [その他] J [GCログ] K [GC原則] L [分配確保] A - > BB - > CC - > DA - > EE - > FA - - > II - > JI - > KK - > L

保守&正確な

保守的なガベージコレクションのGCおよびGC正確式、場合参照タイプ現在のフィールドは、ガベージコレクションにJVMであるかどうかを決定する保守的かつ正確な手段にJVM。以下の詳細な説明は、参照

  • 保守的GC

    保守的なGCは、JVM変数の型情報が記録されていません。オブジェクトのヒープがある場合GCのルーツは、すべての領域毎時間ガベージコレクション(ネイティブメソッドスタック、JVMスタック、静的メソッドゾーン)、疑いのポインタ変数が見つかった場合(例えば、実際のポインタ、整数など)、JVMチェックをスキャンオブジェクト情報は、そうでない場合は、メモリから削除され、メモリの一定期間は、オブジェクトによって占有されている識別するために、メモリ割当てテーブルに格納される場合、このメモリ割り当てテーブルは、次の割当のために存在します。あなたは整数型に起こるとアドレスへのポインタポイントが同じ場合はJVMは、この変数がポインタでない判断できないため、オブジェクトがまだ「生きている」であるかどうかに関係なくは、保守的なGCは、このメモリに保持されます。同じオブジェクトが異なるJVMスタックフレームと変数型で使用することができると区別することができないので、それは、そう保存(ポインタ値とちょうど同じ整数値の場合)JVMスタック値「アドレス」を変更することはできませんGC型のオブジェクトのみ同様のマークを使用して、移動することはできません - スイープアルゴリズムは、メモリを回収します。JVMは、(他のダイレクトメモリアクセスである)ハンドルを使用してオブジェクトにアクセスする場合、保守的GCは、オブジェクトを移動させることができるが、回復の目的は依然として現象を解消することができない存在

  • 半保存的GC

    スタックJVM内の変数は、典型的には、情報の種類を含んでいないが、ヒープ内のオブジェクトは、情報の種類を含んでいてもよい(例えば反射、この仮想関数テーブルの概念C ++のような)は、ヒープゴミオブジェクトポインタ型缶決定に関係なく整数とポインタの上記タイプの存在しないこの時点で、スタックポインタは、式の正確な回復を達成することができ、ターゲットを移動させることができます

  • 正確な式GC

    それは、典型的には、補助データ構造とメモリ空間を必要とするJVMメモリ回復は、データがOopMapにホットスポットに記憶されているときに正確にポインタの位置を決定する式GCのタイプを指し

OopMap

OopMapも、JVMがGC内のすべての静的領域とスタックフレームをスキャンする必要はありませんので、スタックフレームは、実行時に動的に変化し、一般的にOopMapに保存されているGCのルーツでのHotSpot正確なごみのリサイクル、HotSpotのための基礎となっているので、コンテンツOopMap絶えず変化

OopMapクラスファイル内で変更されたことは、コンパイル時にロードされ、JIT(ジャストインタイムコンパイラ)されます

OopMapを更新する場合は?

するときは、コードを更新またはOopMap特徴は何時にする必要がありますか?効率が低すぎるようにコンパイラは、それがOopMapを更新する必要があるかどうかを確認するために、各裁判官の命令を実行することはできません

セキュリティのポイント

GCはすでに、すべてのGCのルーツが含まれており、オブジェクト間の参照がGCの過程で変更されないときGCはOopMap、更新OopMapの後に行われる必要があるので、JVMおよびガベージコレクションは、任意の位置で自由にすることはできません、JVMなりますガベージコレクションの場所が安全な点として知られている場所の条件を満たしている特定の条件を満たしている必要があります。一般的なセキュリティのポイントは以下のとおりです。メソッド呼び出しサイクルがジャンプし異常なジャンプ、これらの点は、オブジェクト間の参照を変更しません。

ガベージコレクションは、すべてのスレッドが安全なポイントに実行する必要があり、2つの方法があります

  • プリエンプティブな割り込み(まれ)

    それが安全な地点に到達するまでスレッドがその動作の再開に安全なポイントに実行されていない場合はJVMは、すべてのスレッドを停止します

  • アクティブな割り込み(共通)

    フラグを設定するJVMは、このフラグは、スレッドセーフポイントに到達したときにチェックし、自動的に実行を停止しています

セキュリティゾーン

スレッドがブロックされた、またはスリープされている場合は、スレッドがセキュリティのポイントを実行することはできません、JVMがGCすることはできません、あなたは地域の安全保障の概念を必要とします。いわゆるセキュリティゾーンは、セグメントの変更は発生しません命令との関係への参照です。これは、JVMの問い合わせのための安全なゾーンに識別スレッドを与えられます

一般的なガベージコレクタ

これまでのところいずれのシナリオで達成ユニバーサル、非常に優れた性能は、ガベージコレクタが出てくるから表示されますので、ほとんどの要求は、異なるシナリオで異なるガベージコレクタを選択する必要がなく、シーンの特定の詳細な分析

コレクターの新世代

シリアル

シングルスレッドガベージコレクタは、我々はすべてのワーカースレッドの収集を停止する必要があります

ParNew

シリアルマルチスレッドバージョンでは、CMSで使用することができます

パラレル清掃を

マルチスレッド複製アルゴリズムコレクターを使用。他のアルゴリズムは、ガベージコレクションの時間を短縮する方法に焦点を当て、現在のガベージコレクションアルゴリズムの比率は、時間とワーカースレッドの作業時間を制御します。あなたは小さな比率を設定することができ、新しい世代がより多くのメモリを取るでしょう。あなたが大きな比率を設定することができ、新しい世代はもちろん、回復時間が長くなり、より少ないメモリを取るだろう

コレクタ歳

CMS(マーククリアに基づきます)

CMS(並行マークスイープ)最短停止時間コレクタの目標の追求である、それは同時低停止時間コレクタによって特徴付けられるが、歳を推奨しました

ユーザプロセスにおけるガベージコレクションのCMSは、ゴミと呼ばれるユーザー・プロセスによって生成され、この時点で実行される浮動ゴミを、CMSは、リカバリ時に次のガベージコレクションのために待つことができます

古い一般のメモリにCMSは、ガベージコレクションが一定の割合を超えたトリガガベージコレクションの数を減らすことができる割合を増加させる占有されています

シリアル古い(MSC)

シリアル古いのバージョン

パラレル古いです

パラレル清掃を古いのバージョン

ミックス世代別ガベージコレクション

G1

可能性のある将来の代替CMS、G1は同時に、新世代と旧年で使用することができます

GCログ

別のログ・フォーマット異なるガベージコレクタが、一定の共通があります

33.125:[ GC[ DefNew: 3324K- > 152K( 3712K), 0. 0025925 secs] 3324K- > 152K( 11904K), 0. 0031680 secs]   
 
100.667:[ Full GC[ Tenured: 0 K- > 210K( 10240K), 0. 0149142secs] 4603K- > 210K( 19456K),[ Perm: 2999K- > 2999K( 21248K)], 0. 0150007 secs][ Times: user= 0. 01 sys= 0. 00, real= 0. 02 secs]

第一の実施形態の動作において:

  • 33.125は、JVM秒の現在の数から出発し、GCイベントの発生を示します
  • DefNewは異なるガベージコレクタを使用して、新しい世代のガベージコレクション、別のキーワードを表し
  • 3324k-> 152K(3712k)、前方領域のGC使用容量、およびガベージコレクタ領域で使用される容量、ブラケット領域内の現在の総容量ことを示しています
  • 0.0025925秒を費やしたこの新世代のガベージコレクション時間を表します
  • 3324k - > 152K(11904k)、JVM、JVMヒープサイズとGC使用、括弧内の総容量に先立っGCヒープサイズ
  • 0.0031680、ベースのガベージコレクション時間の合計時間

GC原則の一部

  • エデンのオブジェクトの優先順位の割り当て
    • エデンは十分なスペースがある場合は、マイナーGCを起動します
    • 古いのGC(メジャーGC /フルGC)、マイナーGC速度より遅い10倍以上
  • 直接歳に大きなオブジェクト
    • メモリコピーの大量の新世代を避けるため、新しい世代は、一般的にガベージコレクションアルゴリズムのために使用されているコピー
  • オブジェクトの長期生存率は、古い時代に直接行きます、あなたは、オブジェクトが、この値は歳スローさよりも長く生存時間を、設定することができます
  • 動的オブジェクトの年齢推定
    • すべての最初のスペースのサバイバー同じ年齢の和の大きさが半分のスペースサバイバーよりも大きいオブジェクト場合は、対象の年齢以上の年齢が古い入ります
  • スペースの割り当てを保証
    • レプリケーションアルゴリズムの新世代の使用は、サバイバーの新世代は、すべてのオブジェクトを保存することができないとき、あなたは、オブジェクトのメモリの古い部分を保存する必要があるので、マイナーGCを行う前に、通常の空き領域の新世代は、すべてのオブジェクトが使用する領域の合計よりも大きいかどうかを確認するために歳取りますあなたはマイナーGCができることを保証することができれば、成功し、そうでない場合は、通常、大きな問題になることはありませんマイナーGCを確保するために、完全なGCのメイクルームや他のメカニズムをトリガー
    • 周志明は、具体的な説明は、「Java仮想マシンの深い理解」を参照してください。

おすすめ

転載: www.cnblogs.com/jiahu-Blog/p/11748474.html