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

[概要]

  オブジェクトに割り当てられたメモリとメモリリコールを割り当てる対象:最後の自動メモリ管理に提唱したJava技術システムは、自動化のための2つの問題を解決するために起因することができます。

  、話すの一般的な方向に、(ThreadLocalのクラスを使用して)ローカルスレッド割り当てキャッシュ開始場合、TLAB内のスレッドの優先順位は、(ローカル割り当てスレッド、主としてエデン領域の新世代をターゲットに割り当てられ、ヒープ上に割り当てられているメモリ割り当てオブジェクトバッファ)の割り当て。まれに、ルールもない100%の固定割り当て、古い時間に直接割り当てることができる、詳細は現在の用途に依存ガベージコレクションの組み合わせの種類、ならびに仮想マシンのメモリ関連のパラメータを設定することです。

[基本]

  主にJavaヒープ(Javaヒープ)でのJavaオブジェクトの1)メモリ割り当て面積、Javaヒープは新世代と古い時代に分け、新生代は地域に生存者、地区からエデン地区、サバイバーに分かれています。

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

  。3)マイナーGCとフルGC:

  • 新世代GC(マイナーGC):Javaオブジェクトのほとんどは非常に頻繁に、オフの特性Chaoshengの夜ので、マイナーGCを持っているので、新世代のガベージコレクションアクションで場所を指し、通常は比較的速いスピードを回復します。
  • 古いのGC(メジャーGC /フルGC):GCは、古い時代に発生することが意味し、多くの場合、マイナーGCの少なくとも一つを伴う完全なGCは、登場。10倍以上のマイナーGCの速度よりも一般的に遅く、フルGC。

  4)直接、古い年に大規模なオブジェクト

  Javaオブジェクトは、大きなオブジェクトの最も典型的には長い文字列と配列の一種である、連続したメモリ空間の多くを必要と:それは、いわゆるビッグペアにされていい。ラージオブジェクトは、それらを「配置」するのに十分な連続した領域を得るためにメモリ空間が多いとき、多くの場合、簡単にトリガーされる先行ガベージコレクションの大きなオブジェクトにつながり、仮想マシンのメモリ割り当てのための悪いニュースです。

  5)対象物の長期生存率は、古い年を入力します

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

  6)動的な年齢の決意:より良いプログラムの異なるメモリ状態に適応するためには、仮想マシンは、常にプロモーションmaxTenuringThresholdの歳、同じ年齢の前に到達しなければならない年齢の要件の対象とされていない場合はスペースサバイバーのサイズ内のすべてのオブジェクトの合計より多くのスペースサバイバー半分以上、あなたは歳直接行くことができます対象年齢以上の年齢は、必要が要件の年齢maxTenuringThresholdまで待つありません。

  7)スペース割り当て保証:この条件が満たされた場合、それが発生する前にマイナーGCは、まず古い仮想マシンの最大利用可能な連続スペースが総容量の新世代内のすべてのオブジェクトよりも大きいかどうかを確認し、その後、マイナーGCは、それが安全であることを確認します。満たされていない場合は、仮想機会がHandlePromotionFailureの設定が失敗したことを保証できるようにするかどうかを確認します。許可された場合、それは前の歳より大きいの古い最大利用可能な連続スペースがより大きい場合には、オブジェクトの平均サイズに昇進したマイナーGCにもかかわらず、マイナーGCを実施しようとするかどうかをチェックしていきます危険です。未満ならば、またはHandlePromotionFailureの設定が、完全なGCを行うために必要とされる今回の冒険を許可していません。

  以下は、「冒険」これはどういう意味ですか?新生代はコピーコレクションアルゴリズムを使用し、唯一のバックアップとして1人のスペースサバイバー回転を使用するメモリの使用率なので、多数のオブジェクトがマイナーGCはまだ生きて現れる場合(最も極端なケースを説明すべてのオブジェクトが生き残った後のメモリの回復の新世代)であり、我々はサバイバーは、古い時代にオブジェクトを直接収容することができない、保証歳割り当てられる必要があります。そして、このような保証をする歳に似た生活の中で融資保証は、古いが、これらのオブジェクトが保持しています残りのスペース自体は、実際のメモリの回復の前に存続しますどのように多くのオブジェクトの合計が明確か分からないので、私が持っていたことを提供しましたすべてのテイクが経験として、オブジェクトの値の古い値の容量の平均サイズ、および古い年の比較の残りのスペースに昇進した前に、完全なGCは、より多くのスペースを解放するために、古い年せるかどうかを決定します。

  実際の比較はまだ平均よりはるかに高い生存時間のフルGCの急激な増加、後のオブジェクトならば、それはまだセキュリティ失敗(ハンドル推進の障害)につながる、つまり、動的な確率の手段を平均しました。HandlePromotionFailure障害がある場合は、それが失敗した後のフルGCを再起動する必要がありました。セキュリティの失敗の時間の周りに円が最大であるが、ほとんどの場合、まだスイッチをHandlePromotionFailureます開いているものの、完全なGCは、あまりにも頻繁に避けます。

  JDK 1.6アップデート24の後、HandlePromotionFailureパラメータ空間は、仮想マシンの割り当て保証ポリシーには影響しません、それはルールになっ:のみ最大の連続した領域、古い時代には、オブジェクトまたは前のプロモーションの平均サイズの新世代の合計サイズよりも大きい、マイナーGCを進めますそれ以外の場合は、完全なGC。

おすすめ

転載: www.cnblogs.com/zlxyt/p/10989827.html