ホームページ > Java > &#&チュートリアル > Java におけるいくつかのガベージ コレクション原則の詳細な説明

Java におけるいくつかのガベージ コレクション原則の詳細な説明

伊谢尔伦
リリース: 2017-04-29 13:27:37
オリジナル
1791 人が閲覧しました

Javaでは、整数や参照などの基本的な型を除き、すべてのオブジェクトはスタック領域ではなくヒープ領域に配置されます。この設計により、プログラマは変数のライフサイクルに注意を払う必要がなくなりますが、その代わりに、より多くのガベージが生成されます。

到達可能性

ポインターを逆参照することによってプログラムから直接アクセスできるデータは到達可能です。

局所性の原理

プログラムの保存場所が短期間に再度アクセスされる可能性がある場合、そのプログラムには時間的局所性があると言われます。アクセスされたメモリ位置の近くの位置が短期間内にアクセスされる可能性が高い場合、プログラムは空間的に局所化されています。

一般に、プログラムはコードの 10% の実行に時間の 90% を費やすと考えられています。

いくつかのガベージコレクターの原理

マークスイープコレクター

このコレクターは、最初にオブジェクトグラフを走査して、到達可能なオブジェクトをマークし、次にマークされていないオブジェクトのスタックをスキャンして、それらのメモリを解放します。このタイプのコレクターは通常、単一のスレッドを使用して動作し、他の操作を停止します。さらに、マークされたオブジェクトを圧縮せずにマークされていないオブジェクトのみをクリアするため、大量のメモリの断片化が発生し、メモリが浪費されます。

マーク-コンパクト コレクター

マーク-スイープ-コンパクト コレクターとも呼ばれ、マーク-スイープ コレクターと同じマーキング フェーズを持ちます。第 2 フェーズでは、スタックを圧縮するために、マークされたオブジェクトがスタックの新しい領域にコピーされます。このコレクターは他の操作も停止します。

Copying Collector

このコレクターは、スタックを 2 つのドメイン (通常はハーフスペースと呼ばれます) に分割します。毎回スペースの半分だけが使用され、JVM によって生成された新しいオブジェクトはスペースの残りの半分に配置されます。 GC が実行されると、到達可能なオブジェクトがスペースの残りの半分にコピーされ、スタックが圧縮されます。この方法は、存続期間の短いオブジェクトに適しています。存続期間の長いオブジェクトを継続的にコピーすると、効率が低下します。また、特定のサイズのヒープの場合、常に半分しか使用されないため、2 倍の量のメモリが必要になります。

インクリメンタルコレクター

インクリメンタルコレクターは、スタックを複数のドメインに分割し、一度に1つのドメインからのみガベージを収集します。スタックを細かく分割し、特定のブロックからのみガベージを収集すると理解することもできます。ガベージコレクションを一度に実行します。これにより、アプリケーションの中断時間が短くなるため、ユーザーは通常、ガベージ コレクターが動作していることに気づきません。

部分リサイクルの原則

通常、新しく割り当てられたオブジェクトの 80% ~ 90% は数百万命令以内にあるか、再割り当てされています。

世代別ゴミ回収

コピーコレクターと部分リサイクルの原則に基づいています。

ほとんどのオブジェクトの「若くして死ぬ」特性を利用する効果的な方法。

ヒープを一連の小さな領域に分割し、0、1、2...n の番号を付けます。番号が小さいほど、その領域に格納されるオブジェクトは最初に 0 領域に作成され、埋められます。ガベージ コレクションが完了すると、到達可能なオブジェクトはエリア 1 に移動されます。ガベージ コレクションの各ラウンドは、i 以下のシリアル番号を持つエリアで実行されます (i は、現在埋められているエリアの最大番号です)。

i がリサイクルされている限り、シリアル番号 Xiaoyu i を持つすべてのエリアもガベージ コレクションの対象になります。これは、若い世代ほどゴミが多くなる傾向があり、より頻繁にリサイクルされることを意味します。

最も古い世代は最も成熟したオブジェクトを保存し、これらのオブジェクトのリサイクルは最も高価であり、完全なリサイクルに相当します。一時停止が長くなる可能性があります。解決策は、トレーニング アルゴリズムを使用することです。

HotSpot の 4 つの GC コレクター:
シリアル コレクター:
特徴: リサイクル中はアプリケーションが一時停止されます。
ヤング エリア: Survivor エリア内の Eden および生存オブジェクトを別の Survivor エリアにコピーします (TO に設定) (大きなオブジェクトは直接配置されます)。 TO 領域がいっぱいの場合は、古い領域に直接コピーされます。
古い領域: マーク-スイープ-コンパクト GC アルゴリズムを使用します。つまり、最初に残っているオブジェクトをマークし、次にそれらをクリアします。オブジェクトを削除し、残っているすべてのオブジェクトを領域に移動して、より大きな空き領域を解放します。
適用範囲: ほとんどのクライアント アプリケーションは、このリサイクル アルゴリズムを使用できます。これは、現在のマシンのデフォルトのリサイクル アルゴリズムでもあります (2006)。最後の 64MB 領域の完全な回復には 0.5 秒もかかりませんでした。


並列回復並列コレクター:
機能: マルチコア CPU を利用できます。
若い領域: アプリケーションはまだ一時停止する必要があります。基本的なメカニズムは次のとおりです。
シリアル化ですが、マルチスレッドを使用すると効率が向上します。
マルチコア コンピューターで使用できます。

並列圧縮コレクター:
並列リサイクルと比較して、主に古い領域に新しいアルゴリズムがあります。同時に、ホワイトペーパーによれば、この種のリサイクルは最終的に並列リサイクルに置き換わります。
若い領域: 並列リサイクルと同じです。
古い領域: まず、古い領域を複数の連続した領域に分割し、各領域を並行してチェックし、生きているオブジェクトをマークします (最初に直接参照できるオブジェクトをマークし、次にこれらの領域をすべてチェックします)。密度の低い領域から順に密度の度合い(左側の領域が右側の領域より確実に密である)を決定し、右側の領域を並列に圧縮します。
適応範囲: マルチコア用。ただし、共有率が高い (つまり、1 台のサーバーで複数のアプリケーションを実行している) サーバーの場合は、古いファイルが収集されるため、一時停止時間が必要な環境では、並列圧縮とリサイクルを使用する方が適しています。この領域は低速でマルチスレッドであるため、1 つのアプリケーションの GC は他のアプリケーションに影響を与えます。対応する解決策:

同時マーク スイープ コレクター:
若い領域:
古い領域: 分割 いくつかの手順があります。
Initialmark: GC を実行する必要がある場合、最初にアプリケーションを一時停止し、次に直接参照されているすべてのオブジェクトをマークします。
Concurrentmark: その後、アプリケーションを続行し、マークされたオブジェクトを確認します。同時にすべての生き残ったオブジェクトを取得します。
注釈: アプリケーションを再度一時停止し、同時マーク期間中にアプリケーションによって変更されたオブジェクト (新規、破棄) を確認し、生き残ったオブジェクトをマークします。このフェーズは長時間続きます。終了後のフェーズでは、すべての生きているオブジェクトがマークされ、マークされていないオブジェクトはガベージ オブジェクトになります。

違いは、アプリケーションの一時停止を停止します。他のアルゴリズムから:

第 1 章: 圧縮は実行されません。ただし、将来のメモリ要件を計算することにより、特定のメモリ ブロックがマージ/分割されます。
第 2 章: 古い領域がいっぱいになるまで GC は実行されませんが、スペースが空になったときに開始されます。
2 番目の 3: 圧縮が実行されないため、断片化が発生します。

さらに、CMS は、Concurrentmark ステージで一部の作業のみを実行することもできます。リソースをアプリケーションに返します。この部分は、若い領域のリサイクルの 2 つのアイドル フェーズで完了するように構成されています。通常、このモードは、一時停止時間とプロセッサ数の要件がある場合に使用されます。
一般に、並列処理は、リサイクルと比較して、古い GC の一時停止時間を短縮し (効果が顕著になる場合もあります)、若い GC の時間をわずかに延長します (時間がかかるため)。オブジェクトが若い領域から古い領域に移動するのに時間がかかります。圧縮は実行されないため、最初に適切な領域を見つける必要があります)。これにより、システム全体の実行効率が低下し、メモリ領域の需要が大幅に増加します。

以上がJava におけるいくつかのガベージ コレクション原則の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート