[JVM] 4.Java小さな白Xuechengギャングスター仮想マシンとガベージガベージコレクションアルゴリズムは何ですか

Javaでは、メモリはプログラムのメモリ割り当て要求を満たすためのスペースとして、メモリ内の領域を描画するために、仮想マシン、仮想マシンによって自動的に管理されています。メモリがまだ指定されたプログラムAPEによって表示されて作成しますが、プログラムの猿を解放するが、その後のオブジェクトは透明です。手動回復プログラム猿のワーキングメモリの解放は、ガベージコレクタが自動的に回復します。

オブジェクトの占有スペースを処理する仮想マシンでは、もはやと呼ばれるのリリースで使用されていないガベージコレクション(ガベージコレクション、GC) なって、ガベージコレクションのプログラムモジュールを担当するガベージコレクタ(ガベージコレクタ)

今、仮想マシンは、自動処理を拒否するために、そしてなぜGCとメモリの割り当て、それを理解するために私たちを助けたことを?

あなたは、メモリのオーバーフローのさまざまなトラブルシューティングを行う必要がある場合は、メモリリーク、ガベージコレクションシステムは、高い同時実行性のボトルネックを達成するためになったとき、私たちは、自動的に仮想マシンを管理し、調整するために必要な監視技術を実装する必要があります。これは、知識を持っている必要がありますに焦点を当て、また、JVMのチューニング、トラブルシューティングです。

この記事の焦点は、我々はゴミやガベージコレクションのアルゴリズムは何で紹介し、その後、私たちは、ゴミが何であるかを最終的に見つけることがありますか?あなたは、ガベージコレクションのすべての問題を解決するために、強力なガベージコレクションのアルゴリズムを設計することはできますか?確かに、後述する各ガベージコレクションのアルゴリズムは、それが敬遠独自の長所と短所を持っていません。特定のシーンでは、使用側の柔軟性が最善の策です。

私は、大きな収穫となり、あなたは問題を学ぶことができると思います。

  1. ゴミは何ですか?
  2. ごみをリサイクルする方法?
  3. ガベージコレクションのアルゴリズムは、すべて同じすべてのゴミを解決するために銀の弾丸のようにそこにすることができますか?
  4. GCの分類は何ですか?(マイナーGC、メジャーGCフルGC)
  5. どのようなストップ - 世界の?
  6. ヒープ全体のスキャンを避けるためにどのように?

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

1つのガベージコレクション

前ヒープにリサイクルのためのガベージコレクションで、ほとんどすべてのオブジェクトインスタンスJavaの世界を保った杭では、まず最初に、それは不可能である「死んだ」となっていると、まだ「生きている」これらのオブジェクト、(間を決定することです長い)どのような方法オブジェクトで使用すること。ガベージコレクションは、実際には、外出するように割り当てられていないだろうが、もはや使用のガベージコレクションで再び割り当てることができるようにします。Java仮想マシンの仕様では、ゴミは、オブジェクトによって占有ヒープ領域の死に言及します

つまり、オブジェクトが生きているか死んでいるかを決定しますか?

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

障害に言及する場合、カウンタ値が1だけ減少する;その場所を参照し、カウンタ値が1だけインクリメントされるたびに、カウンタのオブジェクトへの参照を追加しない0いつカウンタオブジェクトはもはや使用されています。言い換えれば、我々は、操作を傍受するすべての参照を更新し、それに応じてターゲットオブジェクトのカウンタを増減する必要があります

余談:私は、その時のiOS開発の研究興味を覚え株式市場のシミュレーションアプリで作られた、今のiOS開発に従事して学習、練習する会社を見つけるために。使用は、Objective-Cの、最初に言語がメモリを管理している、この参照カウントアルゴリズムで使用されているが、後にも自動メモリ管理を持っています。オブジェクトの接触がより原則の自然の中で多くのことを発見した多くの類似点を持っています。

参照カウントアルゴリズムの欠点:

  • 店のカウンターに追加のスペース、そして退屈なアップデートの必要性。
  • 私たちは、循環参照オブジェクトを処理することはできません

どの主要な抜け穴を数える基準と循環参照オブジェクトを処理することはできません。

1.2到達可能性解析アルゴリズム

アクセシビリティオブジェクトが、プログラム中の変数の場合、少なくとも、他のオブジェクトによって参照されるまで、直接または間接的な方法によって、オブジェクトが到達可能(到達可能)であると言われていることを意味します。より正確には、唯一以下の2つの条件のいずれかを満たすオブジェクトは、到達可能であると判断されるであろう。

  • 自身がルートオブジェクトです。ルート(根)がターゲットスタックアクセス以外の空間を指します。JVMは、ローカル変数およびパラメータの現在のスタックフレームとして、グローバルシステム・クラスの変数、スタックに参照されたオブジェクトを含むオブジェクトのルート・セットとしてマークされます。
  • これは、到達可能なオブジェクト参照です。

このアルゴリズムの基本的な考え方は、出発点として、「GCルーツ」オブジェクトの直列になるように、これらのノードから下方に検索を開始することである、と呼ばれる検索パスは、参照チェーン(参考鎖)、GCルーツへのオブジェクトを横断し鎖は(すなわち、このオブジェクトへのGCの根から到達可能ではない)任意の基準に接続されていない、オブジェクトが利用できないことが証明されています。

到達可能性解析アルゴリズムの.JPEG

GCのルーツは何ですか?これは、ヒープ外部ヒープ内の基準点であると理解することができます。

Java言語では、として使用することができるGC根のオブジェクト次のカテゴリを含みます。

  • オブジェクト参照での仮想マシンのスタック(ローカル変数表のスタックフレーム)。
  • メソッド静的プロパティクラスオブジェクト参照エリア。
  • リテラルの参照方法ゾーンオブジェクト。
  • JNIでネイティブメソッドスタックオブジェクト参照(すなわち、一般的には、方法ネイティブ前記)。
  • それは始めたが、Javaスレッドを停止しません。

到達可能性解析アルゴリズムは、循環参照の問題を解決しない参照カウントアルゴリズムを解決することができます。たとえば、オブジェクトaとbはaまたはbに到達することはできませんGCのルーツから始まる限り、お互いを参照する場合であっても、その後、到達可能性解析は、ライブオブジェクトのコレクションにそれらを追加する必要はありません。

Javaで参照(強参照、ソフト参照、弱参照、ファントム参照)の定義と分類は、Javaの内容は少し動揺を参照していますが、多くの企業は、多くの場合、テストサイトにインタビューが、別の1に詳細に説明します。

到達可能性解析アルゴリズム自体、非常に単純ですが、実際には解決すべき多くの問題が残っています。例えば、マルチスレッド環境では、他のスレッドが更新されてもよい参照オブジェクトが既にそれによってその結果、訪問偽陽性(参照をヌルに設定されている)または偽陰性(オブジェクトへの参照が訪問されていません)。また、受け入れることができ殺人は、Java仮想マシンの大部分は、ガベージコレクションの機会を失いました。大きな問題の省略、まだ実際に可能でガベージコレクタがオブジェクトを回復するためのメモリを参照しました。アクセスは、元から回収されたオブジェクトを参照されたら、Java仮想マシンベンの崩壊に直結する可能性があります。

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

私たちの上にJavaのガベージにあるもの、そして私たちは、効率的にゴミをリサイクルする方法を説明し始めました。

2.1マーク - スイープアルゴリズム

マーク - クリア(マーク・スイープ)アルゴリズムは、2つの段階に分けることができます:

  • マークフェーズ:マークは、すべてのオブジェクトが再利用することができます。
  • ステージクリア:すべてのオブジェクトのリサイクルは、空間のこの部分のリリースをマークされています。

このアルゴリズムは、次のような欠点があります。

  1. メモリの断片化ヒープJava仮想マシン上のオブジェクトは、連続的な分布にする必要があり、そのために十分な合計空きメモリが表示されますが、極端な場合を割り当てることができませんでしたことがありますので。十分な連続したメモリを見つけることができません、と事前にガベージコレクションのアクションをトリガーする必要がありました。
  2. 配分効率は低いですそれは連続したメモリ空間であれば、私たちは何をする割り当てられた加算器(ポインタバンピング)をポインタすることができます。無料のリストについては、Java仮想マシンは、空きメモリを照会することができ、新しく作成されたオブジェクトに、いずれかによって、リスト1のアイテムにアクセスする必要があります。

マーク - 次のように概略的なスイープアルゴリズムは次のとおりです。
クリアラベリングアルゴリズム.PNG

2.2レプリケーションアルゴリズム

次のようにレプリケーションアルゴリズムのプロセスは、次のとおりです。

  • 分割領域:メモリ領域は「主戦場」二つ生存領域としてスケーリングされたエデン領域の割り当てに分割される(すなわち、生存者空間は、領域から領域とに二つの等しい割合に分割されています)。
  • コピー:「戦場」を清掃、収集する場合、地域の存続の作品にはまだ生きているオブジェクトをエデンのエリアをコピーします。
  • クリア:前のステージのようにオブジェクトがまだ生きていることを確認するためにされている適切に配置されており、今、「きれいな戦場」缶、エデンエリアと生き残ったエリアの他の作品のリリース。
  • プロモーション:「コピー」のステージのように、面積が生き残っ「存続」オブジェクトのすべてを収容することはできません。直接、古い時代に昇格。

レプリケーションアルゴリズム.PNG

このアルゴリズムは、メモリの断片化の問題を解決するが、ヒープスペース効率の使用は極めて低いです高い生存率目標では、より多くのコピー操作の効率化の必要性が低くなります。

2.3マーク - 照合アルゴリズム

このアルゴリズムは、2つの段階に分かれています。

  • マークフェーズ:マークは、すべてのオブジェクトが再利用することができます。
  • 圧縮相:オブジェクト空間の一端、残りのスペースのリリースに位相シフトをマーク。

アルゴリズムのラベルで標識する工程 - クリアするために同じアルゴリズムが、その後の工程は、その後、端末境界の外側に直接メモリを一掃、直接クリーンアップするオブジェクトを再利用されるのではなく、すべての生存オブジェクトに最後に移動されます。

メモリの断片化の問題を解決するだけでなく、専用メモリ領域の半分を使用することができ、複製アルゴリズムの欠点を回避します。それは非常によさそうだが、そのメモリは、より頻繁に変更、複製アルゴリズムよりもはるかに悪いです、効率上のオブジェクトのアドレスへのすべての生存の参照を整理する必要があります。

マーク - 次のように概略的なアルゴリズムを仕上げることです。
マーク - 照合アルゴリズム.PNG

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

世代別コレクションアルゴリズムダウンなし新しいアイデア、ただ生きている被写体に応じて、メモリ・サイクルが数個に分割されています。あなたは、各時代の特徴に基づいて、最も適切な収集方法を使用できるようにJavaヒープは、一般的に、古いものと新しい世代のに分かれています。
JVMのヒープ世代.PNG

新世代、その後、各時間のガベージコレクション死んで見つかったオブジェクトの数が多い場合、ほんの数が生き残る、の選択複製アルゴリズム、唯一のコレクションを完了するために、ライブオブジェクトの少量の再生の費用を支払う必要があります。古い年が高いため、生存率の目標では、あなたが使用する必要があり、余分なスペースがその保証に割り当てられていないがありソートアルゴリズム-アルゴリズムまたはマークがクリーニング-マークを回復します。

3 HotSpotのアルゴリズム

3.1列挙ルート

到達可能性分析は、例えば、実行コンテキスト(例えば、ローカル変数スタック・フレーム・テーブルとプライマリノードGCルーツグローバル基準(例えば、一定または静的プロパティクラス)として使用することができ、GC根ノードから操作この基準チェーンを見つけるために)インチ 上記の到達可能性解析アルゴリズムを導入し、詳細なGCのルーツがありますが、あなたはそれを見ることができます。

3.2セキュリティポイント(セーフポイント)

安全ポイントは、すなわちプログラムの実行には、安全なポイントに到達したときにのみ一時停止するには、ダウンGC始まるすべての場所で停止することはできません選択したセーフポイントは、どちらもGCは、ロード操作が過度に上昇することをあまりにも多くの場合、あまりにも長く待つことを可能には小さすぎることはありません。

安全ポイントの初期の目的は、他のスレッドが停止するようにしましょう、しかし、安定した実行状態を見つけることではありません。この実行状態スタックでは、Java仮想マシンは変更されません。この方法では、ガベージコレクタは、到達可能性分析「安全」な場所を実行することができます。私は、このネイティブコードを実行し続け、Java仮想マシンが同時にガベージコレクションできるようになります、セキュリティのポイントを残していません。

ランタイムは、安全なポイントに到達したときにのみ一時停止するには、ダウンGC始まるすべての場所で停止することはできません。プログラムの選択された安全性の点は、標準として選択したプログラム実行時間の長い機能を行うかどうか」は基本的です。長時間実行」最も明白な特徴は、多重命令シーケンスである、例えば異常なサイクルスキップ、ジャンプ、などと呼ばれる方法は、これらの機能を有する命令は、セーフポイントが生成されます。

セキュリティの点については、考慮すべきもう一つの問題は、GC内のすべてのスレッドが(これはJNI呼び出しの実行スレッドが含まれていません)が発生する方法です最寄りの安全なポイントに「実行」された後、停止に来ます。

二つのソリューション:

  • プリエンプティブな割り込み(プリエンプティブサスペンション)

    GCが発生したときにコードを実行プリエンプティブスレッドは、すべての混乱のすべてのスレッドの最初の、協力するためのイニシアチブを中断する必要はありません、ローカル中断したスレッドの安全性がポイントではない有することが判明した場合、スレッドの再開に、安全ポイントには「実行」しましょう。応答GCイベント内のスレッドを一時停止するには、この方法で、今はほとんどの仮想マシンありません。

  • アクティブな割り込み(自主サスペンション)

    GCは直接スレッド上で動作していないスレッドを中断する必要がある場合にアクティブに考えたのは、単にフラグに実行の各スレッドをポーリングするには、このイニシアチブをフラグを設定し、それが中断し、自分自身を中断したときに割り込みフラグが真であることが判明し、中断されました。投票所とセキュリティのポイントをマークするには、オブジェクトがローカルメモリを割り当てる必要が作成するために、偶然、別のプラスです。

3.3セキュリティゾーン

コードフラグメントの部分を指し、参照関係は変化しません。この領域では、GCを開始する任意の場所は安全です。安全な地域はまた、セーフポイントに展開されていると見ることができます。

知識の4拡張

4.1 GCの分類

マイナーGC:

  • 新世代のために。
  • これは、Javaオブジェクトのほとんどは、そうChaosheng Xiは死ぬ性質を持っているので、新世代のガベージコレクションのアクションで場所を指し、非常に頻繁にマイナーGCを、通常、比較的速いスピードを回復します。
  • トリガー:エデンのスペースがいっぱいになったとき。

主なGC:

  • 古い時代の。
  • GC古い時代に発生したことをいい、主なGCあったが、多くの場合、少なくともGCマイナーの1を伴う(しかし、絶対的ではないが、選択プロセスの主なGCコレクション戦略の並列スカベンジコレクタの直接の戦略があります)。主なGCの10倍以上のマイナーGCの速度よりも一般的に遅いです。
  • トリガ条件:スペースが十分でない場合はマイナーGCは、この時点では、古い時代に、その後、トリガ主なGCを歳のオブジェクトになります。

フルGC:

  • 全体のヒープ領域をクリーンアップします。フルGC、ある意味ではマイナーGCと主なGCのを組み合わせるために言うことができます。
  • トリガ条件:にSystem.gc()を呼び出す;スペースの古いの不足、スペース割り当て保証の失敗。

4.2ストップ世界

ときGCは、すべてのJavaを停止する必要がありますスレッドを実行している、ストップ・アット・世界

あなたは時に「アイデンティティ」は全体の実行システムの解析の期間がある時点で凍結されているように見える、分析が表示されないことを意味し、到達可能性分析、一貫性のあるスナップショットを確保することができなければなりませんオブジェクト参照状況のプロセスはまだ、分析精度の結果を保証することはできません、満たされていない関係を、進化しています。

ストップ世界を達成するために、セキュリティのポイント機構を介してです。Java仮想マシンがストップ世界の要求を受信すると、すべてのスレッドが要求ストップ世界排他的なスレッドの作業を許可する前に、安全なポイントに達しているため、それが待機します。

4.3カードテーブル

シーンは、可能な参照オブジェクトのオブジェクト・旧の新世代、時間をマークライブオブジェクト、古い時代のすべてのオブジェクトをスキャンする必要があります。オブジェクトは、オブジェクトの新しい世代への参照を持っているため、その後、参照はGCのルーツと呼ばれます。あなたは、ヒープ全体をスキャンする必要がないということ?それはあまりにも多くの費用がかかります。

与えられたHotSpotのソリューションは、と呼ばれるカードテーブル(カード表)技術。技術は、サイズカードの512バイトの全体のスタックに分割され、カードは、各カードのフラグを格納するためのテーブルを維持します。このフラグは、対応するカードを表しているかどうか、オブジェクトの新しい世代にあっ指している可能性があります。可能ならば、我々はこのカードが汚れていると思います。

マイナーGCを行って、我々は全体の十年古いスキャンしますが、カードテーブル汚いカードを見て、そしてカードが汚れたオブジェクトはGCのルーツマイナーGCのに追加されていることができません。すべてのスキャン汚れたカードが完了した後、Java仮想マシンは、フラグは、すべてのダーティカードでクリアされます。

カードの新世代への各カードオブジェクトの基準点がダーティとしてマークされ、その後、Java仮想マシンは、各基準インスタンス変数を作成し、対応するライトフラグ操作を行う傍受する必要があることを確実にするために存在することもできます。

カードの表が大幅にGCの効率を向上させることができ、古い時代の完全なヒープ領域のスキャンを減らすために使用することができます

おすすめ

転載: www.cnblogs.com/heyonggang/p/11410828.html