ホームページ  >  記事  >  Java  >  Java メモリ管理: 割り当てとリサイクル戦略の詳細な説明

Java メモリ管理: 割り当てとリサイクル戦略の詳細な説明

WBOY
WBOY転載
2023-04-22 15:04:171132ブラウズ

Java メモリ管理: 割り当てとリサイクル戦略の詳細な説明

Java メモリ管理: 割り当てとリサイクル戦略の詳細な説明

表 3-4 ガベージ コレクションと -XX に関連する共通パラメータ: UseSerialGC

Java メモリ管理: 割り当てとリサイクル戦略の詳細な説明

Java メモリ管理: 割り当てとリサイクル戦略の詳細な説明

Java メモリ管理: 割り当てとリサイクル戦略の詳細な説明

概念的には、オブジェクトのメモリ割り当てはヒープ上に割り当てられる必要があります (実際には、スカラー型に分解してスタック上に間接的に割り当てることもできます) [1])。クラシック世代の設計では、通常、新しいオブジェクトは若い世代に割り当てられますが、まれに (オブジェクト サイズが特定のしきい値を超えるなど)、古い世代に直接割り当てられることもあります。オブジェクト割り当てのルールは固定されていません。「Java 仮想マシン仕様」では、新しいオブジェクトの作成と保存の詳細は規定されていません。これは、仮想マシンが現在使用しているガベージ コレクタと仮想マシンのメモリ関連機能によって決まります。 . パラメータ設定。

オブジェクトは最初に Eden に配置されます

オブジェクトは、ほとんどの場合、新世代 Eden 領域に配置されます。 Eden 領域に割り当てられる十分なスペースがない場合、仮想マシンはマイナー GC を開始します。

ラージ オブジェクトは古い世代に直接入ります

ラージ オブジェクトは、大量の連続メモリ領域を必要とする Java オブジェクトを指します。最も一般的なラージ オブジェクトは、非常に大きなサイズを持つオブジェクトです。長い文字列、または多数の要素を含む配列このセクションの例の byte[] 配列は、典型的なラージ オブジェクトです。ラージ オブジェクトは、仮想マシンのメモリ割り当てにとってまったく悪いニュースです。ラージ オブジェクトに遭遇することよりも悪いニュースは、「生きて死ぬ」という「短命のラージ オブジェクト」のグループに遭遇することです。私たちはプログラムを作成します。これ。

Java 仮想マシンで大きなオブジェクトを避けるべき理由は、スペースを割り当てるときに、明らかにメモリにまだ多くのスペースがある場合に、事前にガベージ コレクションが簡単にトリガーされる可能性があるためです。オブジェクトを適切に配置するために十分な連続スペースを確保し、オブジェクトをコピーする場合、オブジェクトが大きいとメモリ コピーのオーバーヘッドが高くなります。 HotSpot 仮想マシンには -XX: PretenureSizeThreshold パラメーターがあり、設定値より大きいオブジェクトが古い世代に直接割り当てられるように指定します。これは、Eden 領域と 2 つの Survivor 領域の間でのコピーの往復を避けることを目的としています。その結果、多数のメモリ コピー操作が発生します。

-XX: PretenureSizeThreshold パラメータは、Serial と ParNew の 2 つの新世代コレクタでのみ有効です。Parallel Scavenge などの HotSpot の他の新世代コレクタは、このパラメータをサポートしていません。チューニングにこのパラメータを使用する必要がある場合は、ParNew と CMS のコレクタの組み合わせを検討してください。

長期的に存続するオブジェクトは古い時代に入ります

仮想マシンは、オブジェクトごとにオブジェクトの存続期間 (Age) カウンターを定義し、オブジェクト ヘッダーに保存します。 . マイナー GC 後、年齢は 1 歳ずつ増加し、ある程度年齢が上がると (デフォルトは 15 歳)、旧世代に昇格します。古い世代に昇格するオブジェクトの存続期間のしきい値は、パラメーター -XX: MaxTenuringThreshold を通じて設定できます。

動的なオブジェクトの年齢の決定

さまざまなプログラムのメモリ状態に適切に適応するために、HotSpot 仮想マシンはオブジェクトの年齢を常に決定する必要はありません。到達 -XX: MaxTenuringThreshold 古い世代に昇格するには、Survivor 空間内の同じ年齢のすべてのオブジェクトのサイズの合計が Survivor 空間の半分より大きい場合、年齢がそれ以上のオブジェクトこの年齢は、-XX: MaxTenuringThreshold で必要な年齢を待たずに、古い世代に直接入ることができます。

スペース割り当ての保証

マイナー GC が発生する前に、仮想マシンはまず古い世代で利用可能な最大連続スペースがすべての世代の合計スペースよりも大きいかどうかを確認する必要があります。条件が満たされていれば、今度はマイナー GC で安全性を確保できます。確立されていない場合、仮想マシンはまず、-XX:HandlePromotionFailure パラメータの設定値が保証の失敗 (ハンドル プロモーションの失敗) を許可するかどうかを確認し、許可されている場合は、仮想マシンで使用可能な最大連続領域が確保されているかどうかを引き続き確認します。古い世代は、古い世代にプロモートされたオブジェクトの平均値よりも大きいです。サイズがそのサイズより大きい場合は、マイナー GC が試行されますが、このマイナー GC は危険です。サイズがサイズより小さい場合、または - XX: HandlePromotionFailure 設定ではリスクが許容されないため、代わりにフル GC が実行されます。 JDK 6 Update 24 以降、テスト結果は異なります。-XX: HandlePromotionFailure パラメーターは、仮想マシンのスペース割り当て保証戦略に影響を与えなくなります。OpenJDK のソース コードの変更を確認してください (コード リスト 3 を参照) -12)、-XX:HandlePromotionFailure パラメーターもソース コードで定義されていますが、実際の仮想マシンでは使用されなくなりました。 JDK 6 Update 24 以降のルールでは、古い世代の連続領域が新しい世代のオブジェクトの合計サイズまたは以前のプロモーションの平均サイズよりも大きい限り、マイナー GC が実行され、それ以外の場合はフル GC が実行されます。 。

以上がJava メモリ管理: 割り当てとリサイクル戦略の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。