まず、学習ガベージコレクションの必要性
あなたは、システムが高い同時実行に達したときに、ガベージコレクションがボトルネックになったときにメモリオーバーフローに関するさまざまな問題をトラブルシューティングする必要がある場合、我々はこれらの「自動化」技術の必要な監視と規制を実装する必要があります。
二、JVMのメモリの割り当てと回復
ガベージコレクションは、主に仮想マシンのヒープメモリです。次のようにスタック図です。
上に示しエデン地域、S0(「から」)領域、S1(「へ」)新世代領域に属し、tentired面積は古い年を属します。
ガベージコレクションの二種類
- 新世代GC(マイナーGCは):回復速度は一般的に高速で、非常に頻繁にマイナーGCで行われ、ガベージコレクションのアクションの新世代を指します。
- 古いのGC(メジャーGC /フルGC) :多くの場合、マイナーGC(絶対ではない)の少なくとも一方を伴う主なGCに登場し、GC古い時代に場所を指し、主なGCの速度は、一般的に遅いの10倍以上のマイナーGCより。
オブジェクトのメモリを割り当て
S0(「差出人」)領域、S1(「へ」)新世代領域に属し、上に示したエデン地域、tentired面積は歳属し
ほとんどの場合、最初のターゲットは、上記エデンのメモリ割り当てであろう。時間のための十分なスペースがない場合。最初のマイナーGCを実行します、S1を入力するライブオブジェクトがある場合、GCは、一般的に、(「から」)エデンとS0に発生し、対象者の年齢は、1(エデン地区を追加します - >サバイバーエリアの件名後の初期の年齢ある程度の年齢は(デフォルトでは15歳)、古い時代に昇格されたときに、1)となります。その後、エデンとS0面積が空になったこのGCは、S1とS0を交換した後、まだ生きているならば、生きているオブジェクトはまた、年齢は1 +となりますので、マイナーGCは、このプロセスを繰り返すことになります、次のマイナーGCを経験します「へ」の領域が満たされるまで、面積が満たされている「と」、すべてのオブジェクトは、古い時代に移動されます後。
一般的なヒープメモリ割り当て戦略
(1)オブジェクトの(3)長期生存が歳入る直接歳に(2)ラージオブジェクトエデン領域に優先対象を割り当てます
動的オブジェクトの年齢決意
同じ年齢の合計サバイバースペースは、年齢以上でに、スペースサバイバー内のすべてのオブジェクトの半分以上の大きさであれば良く、さまざまな状況にプログラムメモリを適合させるために、仮想マシンは常に必要な対象年齢は、古い時代を入力するために、一定の値に到達しなければならないされていませんあなたが直接歳行くことができる年齢はオブジェクト、必要が年齢要件に達していません。
第三には、オブジェクトはすでに死んでいますか?
到達可能性解析
基本的な考え方は、と呼ばれる一連のアルゴリズムを通してことである 「GCルーツ」は 、出発点としてオブジェクト、オブジェクトがGCルーツ・チェーンへの参照を持っていない場合、経路トラバースノードは、参照のチェーンと呼ばれるこれらのノードからダウン検索を開始します接続されて、それは、このオブジェクトが使用できないことを証明しています。
GCのルーツは、オブジェクトとして使用することができます。
(1)仮想マシンのスタック(ローカル変数表のスタックフレーム)参照されるオブジェクト。
静的プロパティゾーンによって参照されるオブジェクトのクラス(2)の方法。
オブジェクト参照(3)メソッドの一定領域。
オブジェクト参照のJNIネイティブメソッドスタック(すなわち、ローカル方法)(4)。
死の対象かどうか
到達可能性分析の到達不能オブジェクトが上映されている:(1)最初にタイムをマーク。条件をスクリーニングすることは、このオブジェクトがファイナライズメソッドを実行する必要があるかどうかです。オブジェクトがfinalizeメソッドではありませんか、finalizeメソッドを呼び出し時代遅れの仮想マシン、仮想マシンをカバーしてきた場合には、これらの2つの場合は、実行する必要があるとみなさ。
(2)第2のマーキング:スクリーニングする目的は、第二F-キュー小さなタグの後にキューF-キュー、GCヒープに配置されます。キューは、メソッドの実装を確定します。
finalizeメソッドは、チェーンのいずれかが、あなたがキューから削除することができますすることができ、その関連付けられているオブジェクトを参照しているオブジェクトにも、自分自身を保存することができます。
しかし、唯一のいずれかのシステムがファイナライズ方法は一度だけ呼び出されるオブジェクトので、自分自身を保存するためです。
第四に、参考文献
(1)強い参照:Obeject OBJ =新しいオブジェクト();このような参照ガベージコレクタは、参照されるオブジェクトをオフに回復しませんでした。
(2)ソフト引用:あり、必ずしもオブジェクトと、システムは、メモリのオーバーフロー例外前に発生するわけではない、これらのオブジェクトを回収秒間の回復の範囲に含まれます。
(3)弱参照:次のガベージコレクションが発生するまでの間だけ存続します。ガベージコレクタのジョブが、かどうかに関係なく十分なメモリの、回収される場合には
(4)仮想基準:最も弱いです。ファントム参照オブジェクトは、主に廃棄物活動の回復を追跡するために使用されています。
第五に、ガベージコレクションアルゴリズム
(1)マーク - スイープアルゴリズム
すべてのオブジェクトがすべて統一オブジェクトが標識後の回復が完了するとマークされ、回収される必要がある最初のマーク:アルゴリズムは、「マーク」と「クリア」のステージに分かれています。それは、その後のアルゴリズムは、その欠陥を与えるために改善され、最も基本的なコレクションアルゴリズムです。非効率とメモリの断片化:このガベージコレクションのアルゴリズムは、2つの明白な問題をもたらすでしょう。
(2)複製アルゴリズム
アドレス効率の問題にするために、「コピー」コレクションのアルゴリズムが登場しました。それは2つの、使用されるのそれぞれに同じサイズのメモリであってもよいです。場合は、この1後のメモリ使用量に、それはまた、ライブオブジェクトは、空間に別の部分にコピーし、その後、一度使用してから出てきれいにします。これは、各復元されたメモリは、リサイクルのための半分の間隔のメモリであることができます。
新世代に使用されるこのアルゴリズム現在使用されている世代アルゴリズムは、新しい世代は1に記載していない:1が分割されているが、(エデン+ S0)S1と2つの部分に分割されます。
(3)マーク - 照合アルゴリズム
アルゴリズム歳提案ラベルの特徴によれば、まだプロセスをマーキングし、「マーク - スイープ」アルゴリズムは同じですが、リサイクル可能なオブジェクトの回復のために、しかし、全ての生存オブジェクトに直接ではなく、次のステップは、クリーンアウトに直接その後、一方の端に向かって移動し、エンド境界以外のメモリ。
このアルゴリズムは、古い年を使用するために使用されます
(4)世代コレクションアルゴリズム
現在のガベージコレクション仮想マシンの実装は何も新しいアイデアである世代コレクションアルゴリズム、が、別のオブジェクトに応じては、いくつかの作品の中にメモリの期間を生き残ります。一般的にはJavaヒープ新世代と古い時代に、私たちは、各時代の特徴に基づいて、適切なガベージコレクションのアルゴリズムを選択することができます。
あなたは、アルゴリズムをコピーすることを選択することができるように例えば、新しい世代に、各コレクションは、死ぬために多数のオブジェクトを持つことになり、唯一の各ガベージコレクションを完了するために、少数のオブジェクトの複製のコストを支払う必要があります。生存の古いターゲットの可能性が比較的高く、我々は選択しなければならないので、余分なスペースは、その保証に割り当てられていないがある「マーク - スイープ」や「マーク - 仕上げ」ガベージコレクションのアルゴリズムは。
第六に、ガベージコレクタ
(1)シリアルコレクタ
これは、ガベージコレクションのとき、スレッドは他のすべての作業を中断しなければならない、シングルスレッドのコレクターです。
長所:シンプルかつ効率的。
短所:一時停止の感があり、ユーザーに悪い経験を与えます。
(2)ParNewコレクタ
これは、シリアルのマルチスレッドバージョンであります
それは(真の意味での並行コレクタは、に後で紹介します)シリアル・コレクターに加えて、それが唯一のCMSコレクタで動作する、サーバーモードで実行されている多数の仮想マシンの最初の選択肢です。
並列同時の概念が追加しました:
-
パラレル(並列) :パラレルガベージコレクション内のスレッドの数を意味するが、この時間は、ユーザスレッドは待機状態のままです。
-
並行処理(同時)は:行う(必ずしも平行ではなく、交互に行うことができる)、ユーザプログラムの実行を継続し、別のCPU上のガベージコレクタを実行しながら、ユーザスレッドとガベージコレクションスレッドを指します。
(3)並列の清掃コレクタ
並列スカベンジコレクタはまた、コピーアルゴリズムマルチスレッドコレクタを使用します
並列スカベンジコレクタ懸念は、スループット(CPUの効率的な使用)です。フォーカスCMSおよび他のガベージコレクタの停止時間は、複数のユーザスレッド(ユーザ・エクスペリエンスを向上させる)です。スループットは、かかる実行時間の合計ユーザーコードの割合のCPUのCPU時間と呼ばれます。
照合アルゴリズム - の古いマークを使用してレプリケーションアルゴリズムの新世代を使用して(1)(2)(3)、。
(4)シリアル旧コレクター
シリアル・コレクターの古いのバージョンでは、それはまた、シングルスレッド化コレクタです。これは2つの主な目的を有する:1つの用途は、JDK1.5と以前のバージョンであり、別の用途を用いて並列スカベンジコレクタは代替計画、CMSコレクタとしてあります。
(5)パラレルオールド・コレクター
昔の並列スカベンジコレクタのバージョン。アルゴリズム-マルチスレッドおよび「仕上げマーク」の使用。機会のスループットとCPUリソース上の焦点は、それがパラレルスカベンジコレクタとパラレル旧コレクタに優先権を与えることができます。
(6)CMSコレクタ
CMS(並行マークスイープ)が最短復旧時間目標ポーズコレクターのためのコレクタです。これは、アプリケーションを使用する際のユーザーエクスペリエンスを中心と一致しています。
CMS(並行マークスイープ)のHotSpot仮想マシンのコレクタが初めてガベージコレクションスレッドを実現し、ユーザスレッド(基本的に)同じ時間にしましょうという意味で、最初の真のコンカレントコレクタです。
使い方スイープ「アルゴリズム-マーク
初期ラベル: 速く、他のすべてのスレッドを中断し、直接ルートに接続されている記録オブジェクト。
同時マークは: 同時にオブジェクトまで記録するために閉鎖構造で、GCとユーザスレッドを回しました。しかし、この段階の終わりに、これはオブジェクトへの現在のすべてのアップが含まれている閉鎖構造を保証するものではありません。ユーザスレッドが継続的に参照フィールドを更新することができるので、そのGCスレッドがリアルタイム分析のアクセシビリティを保証することはできません。だから、代わりにこのアルゴリズムは、参照を起こるこれらの更新を追跡します。
ラベル変更: ユーザプログラムの結果がはるかに同時よりも、通常はやや長い時間よりもマークの初期段階を、この段階での記録マークのマーク変動、滞留時間のオブジェクトの一部を実行し続けとして再マーク補正の段階では、並行マークにありますマーク相短時間
同時クリア: GCスレッドがマークされた領域のためのクリーニングを行うには開始している間、ユーザスレッドを開きます
(7)G1コレクタ
G1(ガベージ・ファースト)は、主に複数のプロセッサと、機械の大記憶容量と同じ時間、ガベージコレクタのためのサーバである。GC休止時間の要件を満たすために、高い確率、さらに性能特性スループット高を含みます。
進化の重要な特徴は、JDK1.7のHotSpot仮想マシンと考えられています。これは、次の特性があります。
- 平行と並行:G1は、CPU、マルチコア環境下でハードウェアの利点を最大限に活用することができ、複数のCPU(CPUまたはCPUコア)の使用は、ストップ世界の休止時間を短縮します。他のコレクターの中には、そうでない場合は、GC一時停止のJavaスレッド実行アクションを必要とする、G1コレクタはまだ同時経由でJavaのプログラムを続行することができます。
- 世代別コレクション:G1は、他のコレクターで必要とされないかもしれないが、独立して全体のGCヒープを管理することができ、それでも世代の概念を保持します。
- 空間統合:CMS「マーク-クリーンアップ」と異なるアルゴリズム、G1は、全体的に実装され、コレクションのアルゴリズム「を整理するタグ」に基づいており、ビューのローカルポイントから「コピー」アルゴリズムに基づいています。
- 予測可能な一時停止:これは、CMSの他の大きな利点にG1の相対的で、G1は、滞留時間とCMS共通の関心事を低減されますが、低G1ポーズの追求に加えて、休止時間モデルは、予測可能な、許可使用を確立することができます明示的にミリ秒単位で長さMの時間区分を指定することもできます。
おおよそ次のステップに分割操作G1コレクター:
- 初期マーク
- 並行マーク
- 最終マーク
- フィルターのリサイクル
バックグラウンドにおけるG1コレクタが許可各収集時間に応じて、優先順位のリストを維持する、嗜好リージョン回復の最大値(その名前の由来であるガーベッジ・ファーストです)。このメモリ空間は、コレクタGF限定時間捕集効率ができるだけ高い(メモリがバラバラ)のようにすることができることを確実にするために、地域及び優先領域の回復方法を使用して分割されています。