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

死んだオブジェクト

オブジェクトが1つである2つの方法がありますが、「死んだ」となっているかどうかの一般的な判断は引用计数法、そこにあります可达性分析法

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

障害に言及する場合、カウンタ値が1だけ減少する;オブジェクト0のための任意の時間カウンタを使用することは不可能であり、その場所を参照し、カウンタ値が1だけインクリメントされるたびに、カウンタのオブジェクトへの参照を追加します。

参照カウントアルゴリズムを介して、Java仮想マシンではないオブジェクトが生きているかどうかを決定します。

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

一連のオブジェクトを介してこれらのノードから下方に検索を開始するために、出発点として、「GCのルーツ」と呼ぶ、と呼ばれる検索パスは、オブジェクトが(GCルーツ・チェーンへの参照を持っていない場合、参照チェーン(参考チェーン)を横断しましたGCのルーツから、それは、このオブジェクトが使用できないことを証明している)このオブジェクト次第ではありません。
Java言語では、オブジェクトは、次のカテゴリのGCルーツとして使用することができます。

  • VMスタック(ローカル変数テーブル・スタック・フレーム)参照オブジェクト
  • メソッド静的プロパティクラスオブジェクト参照エリア。
  • 一定の基準物体領域の方法
  • JNIネイティブメソッドスタックオブジェクトが参照さ

参考文献についての講演

時々 、私たちは、このような需要がある可能性があります:メモリスペースも十分にある場合は、メモリ内に残ることが可能であり、ガベージコレクションを実行した後のメモリ空間はまだ非常にタイトであるとき、あなたはこれらのオブジェクトを破棄することができます。
JDK 1.2の後、ジャワすなわち基準4の導入:強い参照(強い参照)、ソフト参照(ソフト参照)、弱参照(弱参照)、仮想基準(破線参照)。以下は、4つの基準の簡単な紹介です。

  • 一般的に引用された強力な参照が新しいによって作成されている限り、参照は依然として強いと、ガベージコレクタは、参照されるオブジェクトをオフに回復したことがありません。
  • ソフト参照は、いくつかを記述するために使用されますが、オブジェクトとそこにはありません。システムがメモリオーバーフロー例外が起こるために起こっている前に、これらのオブジェクトが回復されます。回復が十分なメモリをしていない場合は、メモリ・オーバーフローの例外がスローされます。
  • 弱参照はまた、次のガベージコレクションが発生するまでのみ生き残ることができるオブジェクトへの弱参照に関連付けられている非必須オブジェクトを記述するために使用されます。場合は、ガベージコレクタのジョブに関係なく、現在のメモリーの妥当性の唯一の弱参照に関連付けられている失われたオブジェクトを回復します。
  • 唯一の効果は、オブジェクトがコレクタに回収される通知を受信するための仮想的な基準系です。

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

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

最も基本的なコレクションアルゴリズムは、「マーク - スイープ」である(マークスイープ)アルゴリズム、アルゴリズムは「マーク」と「クリア」2つの段階に分けられます。すべてのオブジェクトが回復する必要がある、標識後の統一の回復が完了したマーク。ここのマークが到達可能性解析アルゴリズムによりマークされています。

この方法は、二つの問題が存在します。一つは、効率性であるマーキングとの両方のプロセスの除去効率は高くありません。他には、スペースの問題であり、あまりにも多くのスペースデブリをクリアした後に個別のメモリの断片化のマークの多くを生成します、将来につながる可能性大きなオブジェクトの割り当ては、十分な連続したメモリを検索し、事前に別のガーベッジコレクション動作をトリガしなければならなかったことはできません。

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

効率の問題に対処するために、利用可能なメモリが二つの等しいサイズに分割され、唯一それらの1つを使用します。メモリのこの部分を使い切った場合は、それはまた、その後、メモリ空間が一度使用されている、上記の別の部分にライブオブジェクトをコピーしてきれいにします。

現代の商業の仮想マシンが新生代を回復するために、このコレクションのアルゴリズムを使用している、メモリはエデンと2つのサバイバー小さなスペースの大きなスペースに分け、それぞれの時間エデンサバイバーされます。リサイクルすると、エデンとサバイバーも生きているオブジェクトは、一度サバイバースペースの別の部分にコピーされ、最終的にはサバイバーエデンとちょうど使用スペースを一掃します。

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

古い時代の特徴によれば、一般的に「マーク - 仕上げ」を使用 - 同じアルゴリズムが、その後の工程は、直接クリーンアップするオブジェクトを再利用していないが、すべてに生き残っ(マーク・コンパクト)アルゴリズム、プロセスはまだ「スイープマーク」が付いています一方の端部に向かって移動するオブジェクト、および、エンド国境外の直接メモリを一掃。

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

現在のガベージコレクションの事業の仮想マシンが生きているメモリ・サイクルは、いくつかの部分に分割された被写体に応じて、「ゾーニングコレクション」(世代別コレクション)アルゴリズムを実装しています。Javaヒープは、一般的に、各時代の特徴に基づいて、最も適切な収集方法を使用して、古いものと新しい世代のに分かれています。これは、新しい世代に、毎回のガーベジコレクションは、死者多数のオブジェクト、ほんの数が生き残っ、複製アルゴリズムの選択があるだろうさ。リサイクルのためのアルゴリズムを「整理するタグ」または - 古い年生存率は、オブジェクト内の非常に高いために、余分なスペースがありませんが、その保証に割り当てられている、あなたは、「クリーンアップマーク」を使用しなければなりません。

ガベージコレクタ

このアルゴリズムは、収集の方法論のメモリの回復がある場合は、ガベージコレクタは、実装のメモリを回復することです。これは、CMSコレクタとG1コレクタを紹介しています。

CMSコレクタ

CMS(並行マークスイープ)は、最短目標復旧時間のためのコレクターが収集を一時停止しています。その動作プロセスは、4つのステップに分かれています。

  • 初期マーク(CMS初期マーク)
  • 並行マーク(CMS並行マーク)
  • ラベル変更(CMSの発言)
  • 同時クリア(CMS同時スイープ)

このうち、最初のマーカー、再マークは、これらの2つのステップは、まだ「世界を停止」する必要があります。最初のマークがちょうどGCのルーツに直接リンクすることができますどのようなオブジェクトマークし、非常に高速で、コンカレントマークフェーズは、進捗GCのルーツにトレースされ、ユーザプログラムがリードマークを実行し、生成し続けるために再マークの位相補正は、並行マーク中のためにあります、彼らにオブジェクトの変更の一部をマークし、通常は少し長いマークされ、いくつかの初期段階よりも、この段階での滞留時間が、並行マークよりも時間の短いです。

G1コレクタ

G1(ガベージ・ファースト)コレクションは、ガベージコレクタサーバアプリケーション用に設計されています。次のようにG1の機能は次のとおりです。

  • パラレルと同時
  • 世代別コレクション
  • 空間統合:CMSとコレクタアルゴリズムローカル(の間に2つのリージョン)ビューから「コピー」アルゴリズムに基づいています - - G1は、全体の「フィニッシュマークは」に基づいており、異なるアルゴリズムを「マークがクリーンアップ」しかし、どのような場合には、これら2つのアルゴリズムは、通常のメモリが利用可能に提供するために、収集したG1の実行、中に何のメモリスペースデブリを意味しません。
  • 予測可能な一時停止:これはCMS、G1の他の大きな利点にG1の相対的滞留時間およびCMS共通の関心事を低減されますが、低G1ポーズの追求に加えて、休止時間モデルは、予測可能な確立することができます。

G1の前に、他のコレクターのコレクションの範囲は全く新しい世代のか古いのではない、とG1はもはやケースです。
G1コレクタ動作は、以下のステップに分けることができます。

  • 初期ラベル(初期マーキング)
  • 並行マーク(並行マーキング)
  • 最終マーク(最終マーキング)
  • リサイクル(ライブデータのカウントと避難を)フィルター

メモリの割り当てと回復の戦略

オブジェクトの割り当てメモリと、オブジェクトに割り当てられたメモリを解放:最終的な自動メモリ管理に提唱Java技術のシステムは、自動化のための2つの問題を解決するために帰することができます。

エデンのオブジェクトの優先順位の割り当て

多くの場合、エデンエリア内のオブジェクトの割り当ての新世代。エデン領域が割り当てられた十分なスペースがない場合、仮想マシンはマイナーGCを起動します。

直接歳に大きなオブジェクト

いわゆるラージオブジェクトは、Javaオブジェクトを参照する連続したメモリ空間の多くを必要と、大きなオブジェクトの最も典型的には長い文字列と配列の一種です。

オブジェクトの長期生存率は、古い年を入力します

メモリを管理するための世代のコレクションのアイデアへの仮想マシンは、回復したときに、古い時代に配置されるべきオブジェクト、メモリの新世代であるべきであるオブジェクト識別できなければなりません。これを行うには、各オブジェクトの仮想マシンは、対象年齢(年齢)カウンタを定義します。オブジェクトがエデンで生まれ、まだ生きて最初のマイナーGC後、およびサバイバーを収容することができたならば、それはサバイバースペースに移動され、対象の年齢は1に設定されています。マイナーGCによるオブジェクトのたびに、(デフォルトでは15歳)、それはある程度ある年齢を1歳の年齢を増加し、それは古い時代に昇格されます。

動的オブジェクトの年齢決意

よりよい異なる条件プログラムメモリに適応するためには、仮想マシンは常に同じ年齢のサバイバースペースの合計が半分サバイバー、年齢のスペース内のすべてのオブジェクトのサイズよりも大きい場合には、古いマックスTenuringThreshold年に到達するために推進されなければならない年齢の要件の対象ではありませんあなたは、直接要件の年齢MaxTenuringThresholdまで待つ必要が歳行くことはできません以上の年齢に等しいオブジェクト。

概要

上記主に作られた参照「Java仮想マシンの深い理解は、」第三章垃圾收集器与内存分配策略主なアルゴリズムには、Javaの死、ガベージコレクションのアルゴリズム内のオブジェクト、およびは、CMSとG1のガベージコレクタの2種類を紹介するかどうかを判断します。

リファレンス

  • 「Java仮想マシンの深い理解」

おすすめ

転載: juejin.im/post/5d2fdfa96fb9a07f070e62aa