JVMのメモリモデルとGCのガベージコレクション

JVMのメモリ領域

1、プログラムカウンタ

  これは、小さなメモリ空間であり、その役割は場所にコードが実行された最後の時間、スレッドのプライベートを参照して、現在の実行スレッドの指標バイトコードの行番号として見ることができます。

2、Java仮想マシン・スタック

  これは、各メソッドが実行手順を実行するために呼び出され、それはプロセスを積層するスタックから仮想マシンのスタックのスタックフレームに対応し、Javaメモリー・モデルの実行方法であって、プライベートスレッド。

3、ネイティブメソッドスタック

  VMは、ネイティブメソッドを実行するために似ていますが、ネイティブメソッドスタックとスタックプライベートスレッド。

4、Javaヒープ

  存在の唯一の目的は、領域内のアプリケーションは、すべてのスレッドで共有メモリを割り当てているほぼすべてのオブジェクトインスタンスのオブジェクトを格納することです。

5.メソッド領域

  これは、クラス情報は、仮想マシン、定数、静的変数をロードされている格納するために使用され、タイムコンパイラはコードやその他のデータをコンパイルするために、すべてのスレッドが共有しています。

スレッドプライベートエリアの端に、どのスレッドには、ガベージコレクションは、ありません。GCローカル操作は、エリア内のすべてのスレッドで共有されています。

世代メモリ


なぜ世代?

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

 ガベージコレクションのアルゴリズム


  マーク-スイープアルゴリズム(マーク・スイープ)
  これはその名の通り、アルゴリズムは二段階で「マーク」と「クリア」に分けられ、最も基本的なコレクションアルゴリズムであります:

  まず第一にマークされたオブジェクトのすべてのオブジェクトがマークされているから均一なリサイクルマークが完了した後、回復する必要があります。

  その後のコレクションアルゴリズムは、この考えに基づいて、得られたその欠点に改善を行うされているので、それは、最も基本的なコレクションアルゴリズムである理由。

これは、2つの主要な欠点があります。

  1、効率、マーキング及びクリアランスプロセス効率が高くありません。

  2、スペースの問題は、プログラムがその後の実行時に大きなオブジェクトを割り当てる必要があるときに、あまりにも多くのスペースデブリが発生することがあり、離散的な複数のメモリチップをマーキングした後にクリアする必要があります十分な連続したメモリを見つけることができませんが、事前をトリガーする必要がありました別ガベージコレクションのアクション。

複製アルゴリズム(コピー)
効率の問題、収集アルゴリズム「コピー」(コピー)を対処するためには、二つの等しいサイズに分割され、利用可能なメモリ容量に応じて、そこに呼ばれ、各々がそれらの一方のみを使用します。メモリのこの部分がなくなると、コピーはまた、メモリ空間をきれいに一度、その後、使用されている、上記の別の1にオブジェクトを存続します。

各時間が回収されるメモリのブロックは、メモリ、簡単、効率的な動作を割り当てるために、スタックポインタの動きの上面限り、メモリの断片化等時性メモリ割当ての複雑さを考慮しないように。しかし、このアルゴリズムのコストは半分にメモリを削減することです、それは少し高すぎるだろう。

しかし、このアルゴリズムの効率が非常に高いので、今の商業仮想マシンは新しい世代を回復するために、このコレクションのアルゴリズムを使用しています。なぜ、アルゴリズムの新世代は、それをコピーするために使用することができますか?

IBMは、研究は、オブジェクトの新しい世代の98%が夜に向けて死んで生まれていることが示されている特化していますので、あなたは1必要はありません。メモリ空間を分割する1の比率を。ここでは、この観点では、新世代は、次の区分の方針を採用しています。

新しい世代は、3つの部分、大きいエデン(エデン)と2つの小さなサバイバー(生存者)の領域に細分されます。

回収し、エデンサバイバーはさらに、一度サバイバースペースの別の部分にコピーされた生きているオブジェクトを、そして最終的にはちょうどサバイバーを使用しているエデンスペースを一掃するとき。(80%+ 10%)、メモリの10%のみが「なりエデンとサバイバー、すなわち各新世代全容量の90%の新世代のために利用可能なメモリ空間1:HotSpot VMのデフォルトのサイズ比が8であります廃棄物」。

このクリーンアップが完了したら、元の空気のサバイバー、そしてそれがオブジェクトとして再び満開に生き残っ、次のマイナーGCまで空のまま。サバイバー2ターンライブオブジェクトの新世代のトランジット駅の間のGCようになっています。

1の比率:あなたが生きて大量のオブジェクトのメモリ領域の複製アルゴリズムを使用する場合は、レプリケーションのアルゴリズムでも1が必要な場合があり、その後、サバイバーに、それらのライブオブジェクトを保持するための大きな面積を必要とする、延伸になります。だから、古い時代のヒープメモリ領域のために、以下のアルゴリズムがあります。

マーク-照合アルゴリズム
と同じアルゴリズムが、その後のステップは、直接クリーンアップするオブジェクトを再利用されるのではなく、すべての生存オブジェクトに、端末境界の外側に直接メモリを一掃、最後に移動され-マーキングプロセスはまだ「スイープマーク」です。この方法は、破片の生成を回避し、彼らはまた、余分なメモリ空間を必要としない、それは古い時代のためのより適切であろう。

しかし、複製アルゴリズム、アルゴリズムによって占められているが、少ないメモリ空間に比べて、しかし、ガベージコレクション時間のコストが複製アルゴリズムよりも長くなり、それは上記の言いました

私たちは、完全なGCの発生を回避または軽減するようにしてください。

   両方のアルゴリズムは、洗練された言語の記述がある使用します

レプリケーションアルゴリズム:時間のためのスペース

ソートアルゴリズム - マーク:スペースでの使用のための時間を

Wordの魚は、両方を持つことができないと、新しい世代と古い時代のために、彼らは最良の選択です。

 

まとめ
単に知識ポイントのいくつかは、本文中に言及したものを整理

1は、より優れたヒープメモリを管理するために、面積は古いものと新しい世代のに分かれています。
2、新世代のガベージコレクションは、古い時代よりも頻繁に発生します。
3、新生代はマイナーGCなっリサイクルごみ; GC古いのは、フルGCになるために起こりました。
4は、ガベージコレクションのための複製アルゴリズムの新世代を使用して、の古いマークを使用する-照合アルゴリズム
5を、より効率的にメモリの新世代を管理するために、IBMの研究やフィージビリティスタディと組み合わせた複製アルゴリズムに従って、新しい世代が比較的大きく、3つに分割されていますエデン領域及び2つのより小さなエリアサバイバー、8の比:1:1
できるだけガベージコレクションを回避または減少させます

 

:この記事はに再現されhttps://blog.csdn.net/sumj7011/article/details/78087421

おすすめ

転載: www.cnblogs.com/zgwjava/p/10963649.html