転載:JVMのメモリ世代戦略

異なるオブジェクトの生存期間に基づいて、Java仮想マシンは、ヒープメモリは、一般的に新しい世代に分け、いくつかの部分に分割して、JVMのメモリ世代戦略である、(のHotSpot VMの点で)歳で、恒久的な世代。

       なぜ世代?

       ヒープメモリは、仮想マシンのメモリ管理の最大の作品です、ガベージコレクションは、我々はすべてのオブジェクトインスタンスはヒープメモリに格納されているプログラム、最も頻度の高いエリアです。オブジェクトのメモリの割り当てとガベージコレクションの効率を向上させるために世代ヒープメモリ。ヒープメモリがゾーニングされていない場合は、新しく作成されたすべてのオブジェクトとオブジェクトのライフサイクルは、プログラムの実行時に、ヒープメモリが頻繁にガベージコレクションを必要とし、それぞれがすべてを回収しなければならない、一緒に非常に長いです想像してみてオブジェクトは、これらのオブジェクトのトラバーサルは時間コストが膨大である取る、それは真剣に単にひどいです私たちのGCの効率に影響します。

       世代メモリを使用すると、状況が新しく作成されたオブジェクトは、いくつかの回復はまだ永続的な世代に格納されている古い時代、静的プロパティ、クラス情報に格納されているオブジェクトを存続した後、新世代のメモリを割り当てますが、異なっています、生存期間のオブジェクトの新しい世代が唯一の新しい世代領域に頻繁にGCに必要な、短くて、古い時代のオブジェクトのライフサイクルが長く、ガベージコレクションの頻度は比較的低く、頻繁にリサイクルを必要としない、恒久的な世代の回復は、非常に悪く、一般的にガベージコレクションは、それはまた、異なる年齢の特性に基づいて、適切なガベージコレクションのアルゴリズムを使用することができません。世代コレクションが大幅に収集効率を高めるため、これらは、世代のメモリをもたらしたメリットがあります。

       メモリ世代格差

      Java仮想マシンのヒープメモリが分割された新世代古い年永続的な世代、生成方法面積を達成するための恒久的な方法を使用してのHotSpot仮想マシン、この概念の無い他の仮想マシンの実装、およびホットスポットの恒久的な世代のユニークなコンセプトでありますまた、すでに始まっているのHotSpot JDK 1.7のトレンドに代わって永久にそこにキャンセルされた当初、文字列定数プールの永久的な除去に代わって、「永続します」。恒久的な静的変数などの主要な定数、クラス情報、の代わりにデータを保存、ガベージコレクション、新世代と旧年とはほとんどは、ガベージコレクションのメインエリアです。次のようにメモリ世代の図です。

 

       

       新世代(ヤング)

       新世代に記憶されている優先度オブジェクトの新しい世代は、オブジェクトの夜に向けて学生の新しい世代が死亡し、生存率は、新世代では、従来のアプリケーションは、ガベージコレクション、一般的に70%のスペース、高い回収効率の95%にリサイクルすることができ、非常に低いです。

       1:1:ホットスポット新世代8のデフォルト率、大きく2つの小さなエデンスペースサバイバー空間、3分割されています。複製アルゴリズムを回復するため、新世代の使用に分けたHotSpotオブジェクトは、比率は、メモリ空間を活用し、廃棄物を削減するために設定されています。エデンエリア内のオブジェクトの割り当ての新世代(ラージオブジェクトを除いては、直接歳にラージオブジェクト)エデンエリアが割り当てられた十分なスペースがないと、仮想マシンはマイナーGCを起動します。

       オブジェクトは、空き領域(予約領域)が生存するには、唯一の生存領域から領域とエデンに存在する場合、GCが開始されます。GCが行われた場合、エデン地区は、すべてのライブオブジェクトが領域に生存者にはにコピーされ、サバイバー領域からで、まだ生きているオブジェクトは、自分の年齢値に応じ運命を決定する一方、年齢値が年齢のしきい値に達する(デフォルトは、15ですガベージコレクションを介して取得するオブジェクトの各新しい世代は、年齢は、値が1で追加され、GCヘッダオブジェクトに格納されたオブジェクトの世代年齢が)にコピーされるオブジェクトのしきい値に達しなかった、古い時代に移動されますサバイバー領域に。エデンサバイバー領域と地域から次に空、ライブオブジェクトの新しい世代は、サバイバー領域にあります。その後、サバイバー地区からとサバイバーエリアに自分の役割を交換します、それは、新しい地区がサバイバー地区から空にサバイバーへの最後のGCです、新しい地区はどのような場合には、要するに、サバイバーから遺族地区への最後のGCでありますGCが空になった後サバイバーに面積を確保します。対象領域がGCダウンのコレクションを格納するスペースの新世代を生存しなかった生存者にはときに、あなたはの古い割り当て保証、古い時代に保存されているこれらのオブジェクトに依存する必要があります。

       歳(旧)

       新世代の番号の後に(特定のしきい値の仮想マシンの構成を参照してください)まだ古い時代にオブジェクトを存続GC。オブジェクトのライフサイクルの古い時代が長くなり、生存率は、古い時代のGCの比較的高い、比較的低い周波数であるが、回復ペースは比較的遅いです。

       Permanent世代(永久)

       地域のためのコードやその他のデータをコンパイルするための恒久的なストレージ・クラス情報、定数、静的変数、タイムコンパイラを代表して、Java仮想マシン仕様は、ガベージコレクションが、一般的には、ゴミが収集されることはありませんができないことを指摘しました。

       マイナーGCとFull GCの違い

       新世代GC(マイナーGC):マイナーGC Javaオブジェクトの新しい世代のほとんどは非常に頻繁に死んだので、マイナーGCに向かって生の夜であるため、GCの新世代の場所を指し、通常は比較的速いスピードを回復します。エデンは、オブジェクトにメモリを割り当てるための十分なスペースがない場合、マイナーGCをトリガします。

       古いのGC(フルGC /主なGC):フルGCはGCで発生し、古い時代を意味し、全GCの出現は、通常、マイナーGCの少なくとも一つを伴う(旧ターゲットのほとんどがマイナーGCプロセスに新しい世代からなど)歳、:配布は失敗を保証します。10倍以上のマイナーGCの速度よりも一般的に遅く、フルGC。古いメモリよりも小さいか、明示的にはにSystem.gc()メソッドを呼び出すと、回復JVMが本当に完全なGCをトリガした場合、JVMの回復をお勧めします。

 

で再現https://www.cnblogs.com/fangfuhai/p/7206944.html

おすすめ

転載: www.cnblogs.com/sky-yemeng/p/11728519.html
おすすめ