1

SurvivorRatioパラメーターは、2 つの生存者スペースのサイズを制御します。たとえば、-XX:SurvivorRatio=6 は、各サバイバー スペースと eden の比率を 1:6 に設定します。各サバイバー スペースは、若い世代の 8 分の 1 になります。

以下のように、survivor と eden の容量が SurvivorRatio と一致しないのはなぜですか? がプロデュースjmap -heap 15760

Attaching to process ID 15760, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.80-b11

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 0
   MaxHeapFreeRatio = 100
   MaxHeapSize      = 4294967296 (4096.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 1073741824 (1024.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 1074266112 (1024.5MB)
   used     = 276841328 (264.01646423339844MB)
   free     = 797424784 (760.4835357666016MB)
   25.770274693352704% used
From Space:
   capacity = 178782208 (170.5MB)
   used     = 56996280 (54.35588836669922MB)
   free     = 121785928 (116.14411163330078MB)
   31.880286432081654% used
To Space:
   capacity = 178782208 (170.5MB)
   used     = 0 (0.0MB)
   free     = 178782208 (170.5MB)
   0.0% used
PS Old Generation
   capacity = 2863661056 (2731.0MB)
   used     = 98320 (0.0937652587890625MB)
   free     = 2863562736 (2730.906234741211MB)
   0.003433367220397748% used
PS Perm Generation
   capacity = 47710208 (45.5MB)
   used     = 47664440 (45.45635223388672MB)
   free     = 45768 (0.04364776611328125MB)
   99.90407084370707% used

26132 interned Strings occupying 2933384 bytes.
4

3 に答える 3

2

SurvivorRatio = 8各サバイバー スペースは、サイズが Eden + To + From である若い世代の 1/8 を占めることを意味します。あなたの場合、若い世代のサイズは 1365.5 MB で、その 1/8 は 170,69 になります。丸めが含まれていると仮定すると (または他の小さなスペース)、値は適切です。

更新:ここで誤解がありました。あなたの場合の値は有効です。スペースはおそらく最大容量をまだ使用していません。

でテストを実行してみてくださいXms=<value of Xmx>

私の場合(jdk 1.6、1.7、および1.8を使用)、使用SurvivorRatio=10して次の結果を得ました(Java 8にはわずかな違いがありました):

Heap Configuration:
  ...   
  SurvivorRatio    = 10
  ...

Heap Usage:
PS Young Generation
Eden Space:
  capacity = 596508672 (568.875MB)  //Java 8 reported 569.5 here
  used     = 536159440 (511.3214874267578MB)
  free     = 60349232 (57.55351257324219MB)
  89.8829246190741% used
From Space:
  capacity = 59637760 (56.875MB)    //Java 8 reported 56.5 here
  used     = 59626360 (56.86412811279297MB)
  free     = 11400 (0.01087188720703125MB)
  99.9808845939217% used
To Space:
  capacity = 59637760 (56.875MB)    //Java 8 reported 56.5 here
  used     = 0 (0.0MB)
  free     = 59637760 (56.875MB)
  0.0% used

ご覧のとおり、両方のサバイバー スペースは、eden スペースのサイズのちょうど 10% です。Xms=<Xmx>スペースをまだ増やす必要がなかったため、パーセンテージがかなり低くなりました。

更新 2:

どうやら、OPのスペースはすでに最大容量を獲得しており、若い世代は最大1365 MB(最大ヒープサイズ4096 MBの33%)です。その場合、値は生存率が 6 のように見えます (つまり、各生存率スペースは eden スペースの 1/8 を占有します) が、比率 8 を報告する jmap は、ここで何らかのエラー/バグを示しています (私は JVM バージョン 21.0 でテストを行いました)。 b17 と 25.40-b25、つまり OP のバージョン 24.80-b11 はその中間です)。

更新 3:

jdk 7 でテストを 2 回再実行しました。

いいえ 1.:SurvivorRatio設定なし。つまり、デフォルトの 8 を使用する必要があります。

Heap Configuration:
   ...
   SurvivorRatio    = 8
   ...

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 536870912 (512.0MB)
   ...
From Space:
   capacity = 89456640 (85.3125MB)
   ...
To Space:
   capacity = 89456640 (85.3125MB)
   ...

No 2.: 明示的なSurvivorRatio=8セット:

Heap Configuration:
   ...
   SurvivorRatio    = 8
   ...

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 572653568 (546.125MB)
   ...
From Space:
   capacity = 71565312 (68.25MB)
   ...
To Space:
   capacity = 71565312 (68.25MB)
   ...

ご覧のとおり、両方のケースで 8 という値が報告されていますが、比率に違いがあります。比率が明示的に 8 に設定された 2 番目のケースのみが、ドキュメントで提供されている方程式に適合します。これは、デフォルトのケースで使用されている他の比率があり、jmap が間違った比率を報告するか、実際のサイズの計算で異なる値/式を使用することを示しています。

値から、式は次のようになります。

  • 明示的な生存率: size(survior space) = size(eden space)/survivorRatio(例: 546.125 / 8 = 68.25- テスト 2 を参照)
  • 暗黙的/デフォルトの生存率: size(survior space) = size(young generation)/survivorRatio(例: 682 / 8 = 85.25- テスト 1 を参照、値は少し丸められます)

注: これは、jdk 1.8 にも当てはまります。

于 2016-04-21T08:56:53.503 に答える
1

エデンとサバイバーの比率は 6:1 です。サバイバーが 2 人いるため、サバイバーと若いスペースの比率は 1/8 です。

Eden の容量は 1024.5 MB で、1024.5 / 6 = 107.75 で、各サバイバー スペースの 107.5 MB にかなり近い値です。

于 2016-04-21T08:56:12.703 に答える