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

序文

ガベージコレクタは、メモリ回復を具現化され、メモリのガベージコレクションアルゴリズムの方法論を回復。

自動メモリ管理は、次のとおりです。オブジェクトとオブジェクトによって占有メモリの廃棄物のリサイクルを割り当てます。

ガベージコレクションは、範囲: Javaヒープおよびメソッド領域を。

まず、オブジェクトは、アルゴリズムを生きることを宣告されました

1)参照カウントアルゴリズム(主流の仮想マシンを採用していない):それはカウンタをインクリメントするときに参照する場所があるたびに、オブジェクトのカウンタへの参照を追加するため、失敗に言及する場合、カウンタ値を1だけ減少され、いつでもオブジェクトの参照カウントは、それを破棄することとなり、0です。これは、再利用することができます。

利点:シンプル、高効率が決定されます。

短所:困難なオブジェクト参照の間の相互の問題サイクルを解決します。

2)到達可能性分析:アルゴリズムは検索はこれらのノードから下方に、出発点として、「GCルーツ」オブジェクトのシリーズと呼ばれたときにオブジェクトへと呼ばれる探索経路」は、参照のチェーンを横断しましたチェーンへの参照なしでGCルーツ」は、そのオブジェクトは使用できません。

「GCルーツ」オブジェクトからなるものとして:

図1に示すように、仮想マシンのスタック参照オブジェクト。

図2に示すように、メソッド領域静的プロパティクラスオブジェクト参照。

3.一定の基準物体領域の方法。

図4は、ネイティブメソッドは、JNI(すなわちネイティブ一般的方法)オブジェクト参照にスタック。

3)生きるか死ぬかを決定します

でも、オブジェクトの到達可能性解析手法では到達できない、またそれはすぐに回復することです。本当にリサイクルのために廃棄されると考えることがあるので、少なくとも「マーク」二つの事象を通過します。

オブジェクトは、一連の間で鎖内で参照されていない場合に最初に見つかったと「GCルーツ」ノード、スクリーニングは、その確定()メソッドを実行する必要がある場合、それは、一度、一次スクリーニングのためにマークされています。オブジェクトがファイナライズを覆われていない場合()メソッド、またはファイナライズ()メソッドが呼び出され、仮想マシンとなっています。「実行する必要はありません。」と仮想マシン

オブジェクトがファイナライズ()メソッドを実行するために必要であると判断された場合、オブジェクトは、F-キューキューに防止され、低優先度のスレッドによって後に実行します。確定()メソッドは、ゴミをリサイクルするオブジェクトを脱出する最後のチャンスです。その後、F-Queueが二度目を迎えます。期間は任意のオブジェクトとの関係を確立していない場合、及び、第2のマークは、基本的には、実際に回収される後。

第二に、ガベージコレクションアルゴリズム

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

クリアな思考マークアルゴリズムは、2つのフェーズ、第一段階、第二段階に基づいて、「ジャンク」到達可能性解析アルゴリズムのすべての到達不能のマーク、これらのオブジェクトによって占有メモリ空間の直接のリリースから構成されています。

長所:イデオロギーガベージコレクションアルゴリズムの基礎である、その後の回復アルゴリズムは、このアルゴリズムに基づいて改善されています。

短所:

  • 効率性:マークとスイープ効率が非常に低く、私たちは二度ヒープを横断する必要があります。
  • スペースの問題:明確なマークは、メモリの断片化を大量に生成されます。大きなオブジェクトを割り当てる必要ならば、多くの場合、再度ガベージコレクションをトリガします。

2)複製アルゴリズム

メモリは依然としてオブジェクトを存続し、現在のモノリシックなブロックを解放しているシステムは、GC収集アクションを開始する一方のみが、全ての現在のブロックの他のブロックにコピーし、それぞれが2つの等しいサイズのブロックに分割され総メモリ空間。

現代の商用仮想マシン:新世代のターゲット領域を回復するために、このコレクションのアルゴリズムを使用しています。メモリは、一般的にエデン二サバイバー小さなスペースのより大きな部分に分割されます。デフォルトの比率は8:1:1。

この場合、メモリ使用量が50から90パーセントから増加しますが、それでも、我々はすべての回復は、オブジェクトの10%以上が生存のみであることを保証することはできません。今回は、(主才)他のメモリが保証するメモリ割り当てを行う必要があります。

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

高い生存率でオブジェクトの複製アルゴリズムので、それは効率が非常に低くなり、より多くのコピー操作を実行する必要があるが、キーはあなたがメモリの50%を無駄にしたくない、あなたは、メモリ割り当てのための追加のスペースを持っている必要があります90個の以上&ライブオブジェクトの極端なケースに対処するための保証。だから、古い時代にこのアルゴリズムを使用して、直接一般的ではありません。

、実際には、マークの拡張版ソートアルゴリズム - - スイープアルゴリズムを古い時代の特徴によれば、マークを提案しました。しかし、直接リサイクル可能なオブジェクトは、直接クリアされません。これは、同じ側に住んでオブジェクトを移動することで、その後、境界外のメモリを回復します。

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

いくつかの作品に主流のJVM仮想マシンの現在、そして新しいアイデアではありません「世代コレクション」のアルゴリズムに基づいているが、オブジェクトの生存期間の特性に応じて、Javaヒープ。新世代と古い時代。「新世代」は、一般的に短い時間であるアルゴリズムの高い複製効率を使用して断念したオブジェクトの数が多いです。または - アルゴリズムの「マークスイープ」 - 「老い」のメモリ割り当てを保証するための追加のメモリ空間と高い生存率の一般的な目的は、あなたが「クリーンアップマーク」を使用しなければなりません。

第三に、ガベージコレクタ

2つのコレクタの間に接続がある場合、別の世代別ガベージコレクタに作用図は、それと共に使用することができます。仮想マシンは、それはコレクターのコレクタまたは古いの新しい世代に属しているエリア

GCアルゴリズムのいずれかで開催される「世界を停止します」。「世界の停止」によるGCの実装にJVMということを意味し、アプリケーションの実行を停止しました。

  • シリアルコレクター:シングルスレッド、コレクターの新世代、コピーアルゴリズムを使用して。それだけで、それは終わりを収集するまで、すべての彼の仕事スレッドの一時停止、ガベージコレクションが実行され、「世界を停止」しなければならない、ガベージコレクションを完了するために、CPUやコレクション・スレッドを使用します。

  • ParNewコレクター:マルチスレッド版のシリアルコレクタ、制御パラメータコレクションアルゴリズム、世界を停止し、オブジェクト割り当て規則、回復戦略が正確にシリアルコレクタと同じです

  • 並列スカベンジコレクタ:中生代コレクタ、コピーアルゴリズムを使用して、並行マルチスレッド。

  • シリアル旧コレクター: -照合アルゴリズムシリアルコレクターのの古いバージョンでは、マークを使用して、シングルスレッド。

  • パラレル旧コレクター:昔、マルチスレッドの並列スカベンジコレクタのバージョン、マークを使用して-照合アルゴリズム

  • CMSコレクター: -アルゴリズムのポーズの種類は、「スイープマーク」に基づいて、最短目標復旧時間コレクタを得ます。4つのステップの動作プロセス:初期マーク、コンカレントマークと再マークは、同時クリア。

    初期マーク、再マークは、これらの2つのステップは、まだ「世界を停止」する必要があります。最初のマークは、単に非常に高速、GCのルーツに直接リンクすることができますどのようなオブジェクトをマークします。ユーザプログラムは、オブジェクトの変更の一部は、最初の一般的なよりも、この段階での滞留時間のレコードを生成同時マークマークマークによって引き起こさ補正時に動作を継続することであるので、並行マーク相が再マーク相次いで進捗GCルーツトレースであり、そして少し長くマーク相が、はるかに多くの並行マーク期間。

    メモリ回復プロセスCMSコレクタが同時にスレッドを実行しているユーザであるように、プロセス最長同時マークと同時除去プロセスを通じて、コレクタスレッドは、ユーザスレッドで動作することができます。

    長所:同時コレクション、低一時停止

    短所:破片を集めコントロールの多数の末尾にマークをもとに浮いゴミ、スイープアルゴリズムに対処するためにCPUリソースに非常に敏感

  • G1コレクタ: G1コレクタコレクタ技術は、ガベージコレクタサーバアプリケーション指向の最先端の開発成果の一つです。

    G1の特徴:パラレルと同時、世代携帯電話、空間的統合、予測可能な一時停止

    次のように操作プロセスである:最初のマーク、コンカレントマーク、最終的なマーク、フィルタリサイクル。

    初期マークフェーズ:ちょうど、GCのルーツに直接リンクすることができますどのようなオブジェクトをマークし、ユーザプログラムの次の段階を同時に実行するように、TAMSの値を変更し、正しい利用できる地域に新しいオブジェクトを作成することができ、このフェーズは、スレッドを一時停止する必要がありますしかし、それは非常に短くなります。

    コンカレントマークフェーズ: GCのルーツからヒープオブジェクトの到達可能性解析の初め、生きているオブジェクトを見つけ、この段階では、長い時間がかかりますが、ユーザプログラムの実行によって複雑にすることができます。

    最終段階のマーク:それは原因オブジェクトの変更は、内部設定のログを思い出したスレッドに記録この時間の間に生成された記録マーク、仮想マシンのその部分の著しい変化をもたらし、ユーザプログラムの継続動作に並行マーク中に補正することです。最終段階は、スレッドステージを一時停止する必要が思い出しセットに思い出しセットログデータをマージする必要性をマークするが、並行して実行することができます。

    最後に、スクリーニング段階での回復:まず、ソートの各地域の回復値とコスト。ユーザーによるとリサイクルプログラムを開発するためのGC休止時間を期待しています。

第四に、メモリの割り当てと回復戦略

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

直接歳への大規模なオブジェクト:大きなオブジェクトは、Javaオブジェクトであるが、連続したメモリ制御を大量に必要とし、大きなオブジェクトの最も典型的には、長い文字列と配列の一種です。

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

動的オブジェクトの年齢決意:仮想マシンが年齢要件に常にではないがMaxTenuringThreshold年のプロモーションの前に満たされなければならない、古い、同じ年齢のサバイバースペースの合計は、スペースサバイバーのすべてのオブジェクト、対象年齢以上の年齢の半分のサイズよりも大きい場合古い時代への直接アクセス、要件の年齢MaxTenuringThresholdまで待つ必要はありません。

スペース割り当て保証:マイナーGCが発生する前に、それが安全であることを確実にするために、この条件が満たされた場合、古い仮想マシンの最大利用可能な連続スペースは、総容量の新世代内のすべてのオブジェクトよりも大きいかどうかをまずチェック、マイナーGC。満たされていない場合は、仮想機会がHandlePromotionFailureの設定が失敗したことを保証できるようにするかどうかを確認します。

V.の概要

主な要因ガベージコレクションとガベージコレクターの一つは、多くの場合、システムのパフォーマンス、同時能力に影響しているだけで、実際のニーズに応じたので、仮想マシンは、コレクターのさまざまなを提供していますし、調整可能な多数のパラメータを提供する理由と実現します最大のパフォーマンスを得るために、収集方法の最善の方法を選択してください。決まっコレクタ、パラメータの組み合わせは何も避けられないガベージコレクションの動作が、何の最適なチューニング方法、仮想マシンが存在しない、ありません。

おすすめ

転載: juejin.im/post/5d3085eaf265da1ba2529857