Java仮想マシンの研究ノート(B) - ガベージコレクションとメモリの割り当て

免責事項:この記事はブロガーの元で、許可ブロガーなく再生してはなりません。https://blog.csdn.net/weixin_36904568/article/details/90263946

A:メモリリコール

1.どのようなメモリリサイクルする必要がありますか?

  • ネイティブメソッドスタック、Javaメソッドスタック、プログラム・カウンタ:メモリの割り当てと確実に回復、端またはスレッド方法の終了時に、メモリの自動復旧
  • Javaヒープ、メソッド領域動的割当てと回収を伴うメモリは、メモリGCを再利用することが必要です

(1)Javaヒープ使用不能オブジェクト

対象の標準の生存かどうかを確認 - 参照

基準値が記憶されているデータのタイプを表す場合、さらにメモリ開始アドレスであり、このメモリは、基準の代表であります

参照型 参照オブジェクト 機能
強い参照 必要なオブジェクト 限り強い参照オブジェクトがまだあるとの言及が回復されることはありませんし、
ソフト参照(SoftReference) 便利なオブジェクトは必要ありません システム・メモリ・オーバーフロー例外が発生する前に、これらのオブジェクトは、列範囲にリサイクルされ、二次回収
弱参照(弱い参照) 必要のないオブジェクト 回復時間のガベージコレクタで作業している場合
仮想基準(PhantomReference) 生存期間には影響は、インスタンスを取得することはできません、オブジェクトが回収されたときに、システムの通知を取得することはありません
アルゴリズムオブジェクトが生きているかどうかを判断します
参照カウントアルゴリズム

参照カウンタが1だけデクリメントされる障害;参照場所、カウンタがインクリメントされるたびに、オブジェクトのカウンタへの参照を追加するカウンタが0である場合、オブジェクトが利用できません

短所:オブジェクト参照の問題との間の各サイクルを解決することはできません

ルート検索アルゴリズム

GCルーツ一連の出発点として指定されたオブジェクトを介して、検索が停止し、参照用のチェーン路を介してノードから始まり、基準オブジェクトとGCのルーツとの間にリンクが存在しない場合、そのオブジェクトが利用できないことが証明されています

GCのルーツ:

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

二次マーカーオブジェクト

  • オブジェクトは、ルート検索後GCRootsに接続されているチェーンへの参照を発見した、死ぬための準備:最初のタイムをマーク
    • ファイナライズを実行する必要はありません():オブジェクトがファイナライズをカバーしていない()、仮想マシンが実行されているファイナライズ()。(オブジェクトの死は、一度だけ確定します)
    • F-キューオブジェクトは、低優先度のスレッドのファイナライザの実行(オブジェクトも復活チャンス)、キューに配置され、自動的に仮想マシンによって作成された:ファイナライズ()を行う必要があります
  • 第二マーク:キューでのF-キューオブジェクトは、チェーン上のオブジェクトとの関係を再確立するために()メソッドにはできませんすることは、死のオブジェクトをファイナライズによって参照しました

(2)使用される廃棄物のクラスない方法及び定常領域を

一定の基準の生存かどうかを判断する - 参照を

そこにオブジェクトがあるか、または現在の方法は、定数プール、方法、および他の記号参照の定数を参照するかどうか

それが有用であるかどうかを判断するクラス
  • クラスのすべてのインスタンスは回復してきました
  • クラスをロードするクラスローダは、回収されました
  • クラスオブジェクトに対応するクラスが参照されないクラスは、反射法によりアクセスすることができません

2.どのようにメモリを解放するには?

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

まず第一にマークされたオブジェクトの終了マークの後、均一にオブジェクトをリサイクルし、回復する必要があります

機能
  • 非効率性
  • 個別のスペースデブリの数が多いです

(2)アルゴリズム(新世代)をコピー

使用可能なメモリ容量は、ただ1つを使用して同じサイズの2分周されます。コピーは、メモリの別のブロックに使用可能なメモリの件名が不足し、その後、使用するメモリを削除します

機能
  • いいえメモリ断片化しない、唯一の順序に従ってメモリを割り当てます
  • 大型のコスト
ベタービジネス仮想マシン

メモリは、エデン二サバイバー比較的小さなスペース、サバイバーエデンスペースとスペースを使用して、各時間の比較的大きな空間に分割されています。場合は、すべてのオブジェクトの復旧可能コピーワンスサバイバースペース別に、次に使用するメモリを取り外します。
サバイバーに十分なメモリ空間がない場合は、古いのメモリに頼る必要が割り当て保証

(3)マーク - 照合アルゴリズム(歳)

まず第一にマークされたオブジェクトのすべてのライブオブジェクトの終了を標識した後、回復する必要がある1つの端に向かって移動し、オフ側の境界の外にオブジェクトをクリーンアップ

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

片に生存期間オブジェクトの目的によれば、各時代の特性に応じて適切なアルゴリズムを選択

  • 新年:ライブオブジェクトは少量しか、コピーアルゴリズムを使用します
  • 旧年:オブジェクトの高い生存率、マークを使用して - 仕上げアルゴリズムやマーク - スイープアルゴリズム

前記ガベージコレクタ

同時:(の間であり得る)ユーザスレッドの実行スレッド収集
平行:ユーザスレッドは、並列に動作する複数のスレッドを収集するために待機します

(1)シリアルコレクタ

最も基本的かつ最古のコレクタは、クライアントモードのデフォルトのコレクターで実行中の仮想マシンです

機能
  • 他のすべてのスレッドの作業を中断する必要がある場合にシングルスレッド、ガベージコレクションであります
  • シンプルで効率的な、単一CPUのオーバーヘッドの環境では、スレッド間の相互作用

(2)ParNewコレクタ

マルチスレッドシリアルコレクターのバージョンだけでなく、サーバーモードで実行するコレクターの新世代のための選択の仮想マシン

機能
  • マルチスレッドのガベージコレクションを使用します
  • シリアルコレクタ、CMSコレクタを有する唯一の協力に加え、
  • マルチCPU環境では、デフォルトで有効になったスレッドの同じ数とCPUの数(-XXによって:ParallelGCThreadsパラメータは、スレッドの数を制限します)

(3)並列スカベンジコレクタ

パラレル、マルチスレッド、コレクタコレクタは、レプリケーションアルゴリズムの新世代を使用します

機能
  • 目的はであまりにも多くの相互作用を必要としない、ミッション運用の背景のスループットを制御することです
    • -XX:MaxGCPauseMills:最大停止時間のガベージコレクションを設定
    • -XX:GCTimeRatio:総ガーベッジコレクション期間の割合は、スループットの逆数であります
    • -XX:UseAdaptiveSizePolicy:GC適応戦略

(4)シリアル旧コレクター

旧のシリアル・コレクターのバージョンが、また、マークの使用 - シングルスレッドソートアルゴリズムコレクター。

機能
  • メインは、クライアント・モードで使用される仮想マシンです
  • あなたがサーバーモードである場合は、パラレル・スカベンジコレクタを使用することができ、または同時モード故障同時コレクションの使用でCMSコレクタのバックアップ計画が起こるように

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

コレクタ仕上げアルゴリズムをマルチスレッド - パラレルスカベンジコレクターの旧のバージョンは、マークの使用です。

機能
  • かかわらず、下の組合せ(並列スカベンジコレクタ+シリアル旧コレクタ)から、スループットおよびCPUリソースに敏感なアプリケーションに焦点を当てる前シングルスレッド、マルチスレッドが、優先度の組み合わせ(並列スカベンジコレクタ+パラレルオールドコレクタ)

(6)CMS(同時低い休止)コレクタ

休止中にマークに基づいて、最も短い回復時間目標コレクタを得る - スイープコレクタアルゴリズム

プロセス

CMSのユーザーが同時にスレッドを実行して全体的に、回復プロセス

  • 初期ラベル:GCルーツマークオブジェクトを直接関連付けることができます
  • 同時マーク:マークセカンダリルート検索アルゴリズム
  • ラベル変更:改正ユーザプログラムがオブジェクトタグの変更にリードを動作させるために続けるためには、レコードを識別する
  • 同時クリア:クリアするオブジェクトをマーク
機能
  • フォアグラウンドでの動作に適した休止時間のガベージコレクションを、フォーカス、タスクは対話が必要です
  • CPUリソースに非常に敏感:CPUリソースが遅くなるに至る手順の一部を占めることができる、全体のスループットを下げます
    • インクリメンタル同時コレクタI-CMS:並行マークと同時清掃時間、GCスレッドとユーザプログラムで交互に実行し、時間のGC占有リソースを削減
  • 浮動ごみ処理できない:クリーンアップフェーズで生成された新しい同時生ごみを、CMSが実行されているため、ユーザプログラムのためのメモリ空間を確保する必要性から、ほとんど生成されたゴミを収集するために長く待つことはできません。
    • 準備がユーザプログラムを実行するのに十分なスペースがない場合には、(バックアップ計画シリアルオールド・コレクターを開始)全GCの別の世代につながる、並行モード・失敗を表示されることがあります
    • -XXによって:昔のスペースの後に設定CMSInitiatingOccupancyFractionは、N%の収集を開始するために使用されます
  • スペースデブリの大量
    • -XXによって:+ UseCMSCompactAtFullCollectionは、(滞留時間を増やす)デフラグ
    • -XXによって:CMSFullGCsBeforeCompaction、回復を設定した後、N回はデフラグ

(7)G1コレクタ

ラベルに基づいて、最も最先端のコレクタ - ソートアルゴリズムのコレクタ

機能
  • 何のスペースデブリはありません
  • 精密な制御ポーズ
  • スループットを犠牲にすることなく低静止完全に回復。複数の領域に全体Javaヒープ、各領域は、最もゴミを回収します

(8)の組合せの使用を

コマンド コレクター
-XX:UseSerialGC シリアルコレクタを使用
-XX:UseParNewGC ParNew +シリアルオールド・コレクターを使用します
-XX:UseConcMarkSweepGCを ParNew +シリアル旧+ CMSコレクタを使用します
-XX:UseParallelGC パラレル清掃を+シリアルオールド・コレクターを使用します
-XX:UseParallelOldGC パラレル清掃を+パラレルオールド・コレクターを使用します

2:メモリの割り当て

1.配布

(1)小さなオブジェクト

新世代エデン地区、エデンの配分の小さなオブジェクトの優先順位マイナーGCを開始するのに十分なスペース、仮想マシンが存在しない場合

  • エリアにリサイクル可能なオブジェクトをサバイバー、クリア
  • リサイクルの古いメモリ領域にオブジェクト、クリア

(2)ラージ・オブジェクト

直接メモリの古い地区への連続した領域のJavaオブジェクト(文字列またはオブジェクトの配列)の大量の必要性、エデンエリアとコピー作業ゾーンサバイバーの多くを避けます

  • PretenureSizeThresholdパラメータ:シリアルParNewコレクタとコレクタのために、-XXを提供
  • パラレルScanvengeコレクターのために提供する必要はありません

(3)長期生存ターゲット

各オブジェクトは、対象年齢の年齢カウンタはの古いメモリ領域を入力するために、一定の年齢に達しています

  • エデン地域マイナーGC、面積の後に生きて生まれ、サバイバーに移動し、年齢= 1を初期化します
  • たびマイナーGCを経て、時代を生き延び++
  • 場合は年齢= 15歳を入力するとき(-XXによって:MaxTenuringThreshold設定年齢)

(4)動的オブジェクト

その後、サバイバースペース同年代>サバイバー半分のスペース内のすべてのオブジェクトの合計の大きさ、古来、被験者のメモリ領域を入力する高齢者≥

2.スペースの割り当てを保証

マイナーGCを発生し、仮想マシンの平均サイズは、古い時代古い時代のプロモーションは残りのスペースよりも大きい場合を検出します

  • 直接フルGC:より大きい
  • ビューHandlePromotionFailureは、セキュリティの失敗を許可するように設定されています。未満
    • 許可:実施マイナーGC(セキュリティの故障であれば、唯一の再起動のフルGCまで)
    • 許可されていません:フルGCが実行さ

おすすめ

転載: blog.csdn.net/weixin_36904568/article/details/90263946