Java メモリ管理: 割り当てとリサイクル戦略の詳細な説明
表 3-4 ガベージ コレクションと -XX に関連する共通パラメータ: UseSerialGC
概念的には、オブジェクトのメモリ割り当てはヒープ上に割り当てられる必要があります (実際には、スカラー型に分解してスタック上に間接的に割り当てることもできます) [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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです
