2016-04-21 2 views
1

Der Parameter SurvivorRatio steuert die Größe der beiden Überlebendenräume. Beispiel: -XX: SurvivorRatio = 6 legt das Verhältnis zwischen jedem Überlebendenraum und eden auf 1: 6 fest, jeder Überlebendenraum ist ein Achtel der jungen Generation.Warum stimmt das Verhältnis zwischen jedem Überlebendenraum und Eden nicht mit SurvivorRatio überein?

Warum stimmt die Raumkapazität von Überlebenden und Eden nicht mit SurvivorRatio überein, wie unten dargestellt? Hergestellt von 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. 
+1

Dieses seltsame ist, scheint man tatsächlich SurvivorRation 6, 8 nicht –

Antwort

1

Ihre eden Verhältnis Lebender 6: 1, da die beiden Überlebenden gibt es, das Verhältnis der Überlebenden zu jungem Raum 1/8th

Das Eden hat eine Kapazität von 1024,5 MB und 1024,5/6 = 107,75, was ziemlich nah bei den 107,5 MB für jeden Überlebendenraum ist.

+0

erm ... 170,75 ... – Thomas

2

SurvivorRatio = 8 bedeutet, dass jeder Überlebensraum 1/8 der jungen Generation einnimmt, deren Größe Eden + To + From ist. In Ihrem Fall Die Größe der jungen Generation ist 1365,5 MB und 1/8 davon wäre 170,69 - vorausgesetzt, es gibt einige Rundungen beteiligt (oder eine andere kleine Fläche) die Werte sind solide.

Update: Ich hatte hier einige Missverständnisse. Die Werte wären in Ihrem Fall gültig, die Leerzeichen haben wahrscheinlich noch nicht ihre maximale Kapazität genutzt.

Versuchen Sie, einen Test mit Xms=<value of Xmx> auszuführen.

In meinem Fall (mit einem JDK 1.6, 1.7 und 1.8) I SurvivorRatio=10 verwendet und bekam folgende Ergebnisse (Java 8 hatte einige leichte Unterschiede):

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 

Wie Sie beide Survivor Spaces sehen können, sind genau 10% der Größe des Edenraums. Ohne Xms=<Xmx> bin ich zu niedrigeren Prozentsätzen gekommen, da die Felder noch nicht vergrößert werden mussten.

Update 2:

Apparantly die Räume des OP aquired bereits ihre maximale Kapazität mit jungen Generation 1365 MB max aufweisen (die 33% der 4096 MB max Haufengröße ist). In diesem Fall sehen die Werte so aus, als wäre das Überlebensverhältnis 6 (dh jeder Überlebendenraum nimmt 1/8 des Edenraums), aber jmap, die ein Verhältnis von 8 anzeigt, weist auf eine Art Fehler hin (ich habe meine Tests mit JVM Version 21.0- b17 und 25.40-b25, dh die Version 24.80-b11 des OP liegt irgendwo dazwischen.

Update 3:

reran ich meine Tests zweimal mit jdk 7:

No 1 .: kein SurvivorRatio Satz, dh Standard von 8 verwendet werden soll:

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) 
    ... 

Nein 2 .: Explizit SurvivorRatio=8 eingestellt:

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) 
    ... 

Wie Sie sehen können, gibt es einen Unterschied im Verhältnis, obwohl in beiden Fällen ein Wert von 8 gemeldet wird.Nur der zweite Fall, in dem das Verhältnis explizit auf 8 gesetzt wurde, entspricht der Gleichung in der Dokumentation, die angibt, dass im Standardfall ein anderes Verhältnis verwendet wird und jmap entweder ein falsches Verhältnis oder die tatsächliche Größenberechnung einen anderen Wert/eine andere Formel verwendet.

Aus den Werten sehen die Formeln wie folgt aus:

  • explizite Überlebende Verhältnis: size(survior space) = size(eden space)/survivorRatio (Beispiel: 546.125/8 = 68.25 - siehe Test 2)
  • implizite/default Überlebende Verhältnis: size(survior space) = size(young generation)/survivorRatio (Beispiel: 682/8 = 85.25 - siehe Test 1, Werte gerundet ein bisschen)

Hinweis: Dies gilt auch für jdk 1.8.

+0

https://docs.oracle.com/cd/E19159-01/819-3681 /abeil/index.html –

+0

@YanhuiZhou das Problem ist: Sie setzen 'SurvivorRatio = 6' aber Jmap meldet' SurvivorRatio = 8' - das zeigt an, dass Ihre Einstellungen nicht verwendet werden (8 ist die Standardeinstellung). Beachten Sie, dass die von Ihnen gepostete Dokumentation 6 Jahre alt ist und wahrscheinlich nicht mehr für aktuelle JVMs gilt. – Thomas

+0

@ YanhuiZhou auch hier: http://stackoverflow.com/questions/3634465/useadaptivesizepolicy-and-other-jvm-opts - Wahrscheinlichkeiten sind, dass Sie "UseAdaptiveSizePolicy" nicht deaktiviert haben, so dass die Survivor Ratio nicht funktioniert. – Thomas

2

Es scheint, dass sich die Formel für die Berechnung der eden/survivor-Raumgröße irgendwann geändert hat.

Siehe https://searchcode.com/codesearch/view/17980811/, Zeilen 52 bis 54:

Das ist Hinterbliebene Verhältnis berechnet "raw", im Gegensatz zu dem Standard gc, die 2 mit dem Verhältniswert addiert. Wir müssen sicherstellen, dass die Werte gültig sind, bevor Sie sie verwenden.

+0

Genau das habe ich vermutet und gesucht. Wie bei "lese den Code, liegt die Dokumentation";) – Thomas

+0

@ ThomasKläger Ich bin zufällig dagegen gestolpert, aber ich glaube nicht, dass das richtig ist. Das 'plus 2' wird hier referenziert: http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/runtime/arguments.cpp#l1573. Das ist überhaupt keine "SurvivorRatio - 2" ... – Eugene

Verwandte Themen