13

Java ガベージ コレクタをよりよく理解するために、仮想マシン ガベージ コレクションのチューニングに関するこの記事を読みました。各スペースには、必要なヒープ スペースが最大ヒープ サイズに近づくにつれて拡張できる仮想ヒープ スペース領域があります。これは、次の図で確認できます: (ソース: oracle.com )Java GC 世代の配置

NewRatioパラメータでYoung GenerationOld (Tenured) Generationの比率を設定し、SurvivorRatioパラメータでEden SpaceSurvivor Spaceの比率を設定できます。

最近、この質問は、ヒープ スペースのデフォルトの比率を見つけることについて尋ねられました。PrintGCDetailsパラメーターを使用して比率を手動で計算する必要があると書かれています。

私の質問は次のとおりです。さまざまなヒープ領域のサイズが同じ比率で増加するので、アプリケーションのランタイム全体で起動時に設定された比率が一定に保たれますか? たとえば、Young Generation と Old/Tenured Generation のデフォルトの NewRatio が 3 で、最初に予約されたヒープ領域が Young の場合は 100MB、Old の場合は 300MB であるとします。古いスペース用にさらにメモリを確保する必要がある場合は、さらに 300MB 追加して合計 600MB とします。Young Space 用に予約されたメモリも、比率を維持したまま 2 倍の 200MB になりますか?

4

3 に答える 3

9

GC ErgonomicsAdaptive Size Policyについて言及していると思います

  • 実行中のアプリケーションの現在の割り当て動作に基づいて、実行時に世代のサイズを自動的に適応させる Hotspost GC の機能。
  • この機能はデフォルトでオンになっており、実行時に世代のサイズを制御/適応します。
  • 実際、Adaptive Size ポリシーを無効にしないと、一部GC パラメータ無視されます。-XX:SurvivorRatio=.

を使用して、アダプティブ サイズ ポリシーを無効にすることができます。AdaptiveSizePolicy を無効にすると、GC は起動パラメーター ( 、、、など) で指定された世代の初期サイズを尊重し、一定のままになります。-XX:-UseAdaptiveSizePolicy-Xms-Xmx-XX:MaxNewSize=-XX:NewSize=-XX:SurvivorRatio=

アダプティブ サイズ ポリシーの詳細については、UseAdaptiveSizePolicy およびその他の jvm opts を参照してください。

于 2013-03-15T23:32:11.763 に答える
1

PermGen と Young 世代の比率は JVM によって部分的に維持されていますが、比率が維持されていると言うなら、答えはNoです。

JVM7 は十分に高度で複雑になり、ヒープ内の世代の割り当てを予測するべきではありません。

JVM が実行するすべての GC サイクルで、メトリクス分析も行い、現在のアプリケーションのメモリ内ストレージの動作を学習します。- より多くのオブジェクトが GC の複数のサイクルに耐えている場合、PermGen が削減され、領域の一部が YoungGeneration に割り当てられます。基本的にNo. of objectsxnumber of GC cycles they skipは、生成比率を動的に調整する基準を果たします。

役に立てば幸いです、ありがとう。

于 2013-03-15T09:42:09.203 に答える
1

編集:私は何か間違っているかもしれないと思います。私が調査している間、このメモをここに置いて、人々を間違った道に送らないようにしてください!

Parallel Scavenge GC ( ) を使用している場合、Ales0x の回答は優れていますが-XX:+UseParallelGC、Concurrent Mark-Sweep GC ( -XX:+UseConcMarkSweepGC) は適応サイジングをサポートしていません。

Concurrent Mark-Sweep では、new/young 世代のサイズは初期ヒープ サイズに基づいて設定されます ( を指定しない場合-XX:NewSize=)。ヒープが大きくなっても、新しい世代のサイズは変わりません。

于 2013-11-21T18:33:00.597 に答える