記事のディレクトリ
メモリモデル
1.8 1.7と比較すると、最大の違いは、メタデータ領域が永続的な世代に置き換わっていることです。メタスペースの性質は永続的な生成に似ており、どちらもJVM仕様のメソッド領域の実現です。ただし、メタスペースと永続的な生成の最大の違いは、メタデータスペースが仮想マシンではなく、ローカルメモリに存在することです。
ヒープ
- JVM管理メモリの最大の部分は、すべてのスレッドによって共有されるメモリ領域であり、仮想マシンの起動時に作成されます。
- オブジェクトインスタンスを保存する
- ガベージコレクターは主にエリアを管理します。コレクターは基本的に世代別ガベージコレクションアルゴリズムを使用するため、ヒープスペースは新世代と旧世代に細分できます。
- HotSpot JVMは、若い世代を3つの部分に分割します。1つのエデンエリアと2つのサバイバーエリア(それぞれfromとtoと呼ばれます)。デフォルトの比率は8(エデン):1(1人の生存者)です。
- 通常の状況では、新しく作成されたオブジェクトはエデンエリアに割り当てられます(一部の大きなオブジェクトは特別に扱われます)。最初のマイナーGCの後、これらのオブジェクトがまだ生きている場合、それらはサバイバーエリアに移動されます。オブジェクトがサバイバーエリアのマイナーGCを生き残るたびに、その年齢は1年ずつ増加します。その年齢が一定のレベル(デフォルトでは15年)に増加すると、オブジェクトは古い世代に移動します。
- 若い世代のオブジェクトは基本的に生きて死んでいる(80%以上)ため、若い世代のガベージコレクションアルゴリズムはコピーアルゴリズムを使用します。コピーアルゴリズムの基本的な考え方は、メモリを2つのブロックに分割することです。毎回のみ使用します。一方の部分で、このメモリの部分が使い果たされると、残っているオブジェクトをもう一方の部分にコピーします。コピーアルゴリズムでは、メモリの断片化は生成されません。GCの開始時には、オブジェクトは「From」という名前のEdenエリアとSurvivorエリアにのみ存在し、Survivorエリア「To」は空です。
- GCの直後に、エデンエリアに残っているすべてのオブジェクトが「宛先」にコピーされ、「差出人」エリアにある生き残ったオブジェクトは、年齢に基づいてどこに行くかを決定します。年齢が特定の値に達したオブジェクト(年齢のしきい値は-XX:MaxTenuringThresholdで設定できます)は古い世代に移動され、しきい値に達していないオブジェクトは「宛先」領域にコピーされます。
- このGCの後、EdenエリアとFromエリアは空になりました。このとき、「From」と「To」は役割を交換します。つまり、新しい「To」は最後のGCの前の「From」であり、新しい「From」は最後のGCの前の「To」です。いずれの場合も、 __はToという名前のサバイバーエリアが空であることを確認します。
マイナーGCは、「To」領域が埋められるまでこのプロセスを繰り返し、「To」領域が埋められた後、すべてのオブジェクトが古い世代に移動されます。
メタデータ領域(メソッド領域、つまり永続的な生成[1.7])
メソッド領域(永続生成)には、それ自体で設定された固定の上限があり、動的に調整することはできません。メタデータ領域はダイレクトメモリを使用しますが、これはマシンの使用可能な物理メモリによって制限されます。メタデータ領域と永続的な生成は、本質的にメソッド領域の実現です。
仮想マシンスタック
ネイティブメソッドスタック
プログラムカウンター
ダイレクトメモリ(JVMの範囲内ではありません)
JDK1.4によって導入されたNIOクラスは、チャネルのIOモードとバッファ領域に基づいています。ネイティブ関数ライブラリを使用してオフヒープメモリを直接割り当てることができ、Javaヒープに格納されているDirectByteBufferオブジェクトは次のように使用されます。操作のためのこのメモリへの参照。Javaヒープとネイティブヒープの間でデータを前後にコピーすることは避けてください。これにより、パフォーマンスが大幅に向上します。
記事のいくつかの写真はhttps://blog.csdn.net/ztx114/article/details/79400789からのものです記事の
内容はhttps://blog.csdn.net/qq_34337272から参照されています