2017-05-05 1 views
1

Wenn ich auf Hotspot VM mit folgenden Konfiguration meine Java-Anwendung ausgeführt wird: -Xms2048m, -Xmx2048m, die jmap Ausgänge:Hotsot Jvm Optionen

Heap Configuration: 
    MinHeapFreeRatio = 40 
    MaxHeapFreeRatio = 70 
    MaxHeapSize  = 2147483648 (2048.0MB) 
    NewSize   = 1310720 (1.25MB) 
    MaxNewSize  = 17592186044415 MB 
    OldSize   = 5439488 (5.1875MB) 
    NewRatio   = 2 
    SurvivorRatio = 8 
    PermSize   = 21757952 (20.75MB) 
    MaxPermSize  = 85983232 (82.0MB) 

Heap Usage: 
PS Young Generation 
Eden Space: 
    capacity = 706740224 (674.0MB) 
    used  = 364788568 (347.88948822021484MB) 
    free  = 341951656 (326.11051177978516MB) 
    51.61565107124849% used 
From Space: 
    capacity = 4587520 (4.375MB) 
    used  = 1900560 (1.8125152587890625MB) 
    free  = 2686960 (2.5624847412109375MB) 
    41.428920200892854% used 
To Space: 
    capacity = 4456448 (4.25MB) 
    used  = 0 (0.0MB) 
    free  = 4456448 (4.25MB) 
    0.0% used 
    ... 

Was verwirrt macht mich ist, warum die Kapazität von eden Raum und zwei Überlebende Raum nicht gehorcht die Formel

eden/(s0+s1) = SurvivorRatio

Aber wenn ich Anthor Jvm Option -Xmn500m, die jmap Ausgänge scheint vernünftig hinzufügen, dh die Fähigkeit, die Formel streng

Antwort

0

Ich wünsche gehorcht dies ein bisschen mehr Aufmerksamkeit bekommen würde ... In der Tat, Sie haben Recht (dies keine Antwort - aber zu lang für einen Kommentar)

Wenn ich tun:

java -XX:+PrintFlagsFinal | grep SurvivorRatio 
     uintx InitialSurvivorRatio      = 8 

klar ist das . Aber beim Testen verhält es sich eher wie ein (Ich kann Ihren RIESIGEN Unterschied, den Sie mit jdk-8 sehen, nicht reproduzieren). Hier

ist die relevanten Teile, wenn sie mit -Xmx2048m -Xms2048m

PS Young Generation 
Eden Space: 
capacity = 537395200 (512.5MB) 
.... 
From Space: 
capacity = 89128960 (85.0MB) 
.... 
To Space: 
capacity = 89128960 (85.0MB) 

läuft Das heißt:

512/85 6 =

Sobald ich lief der gleiche Code mit dem gleichen -Xmx2048m -Xms2048m, aber füge den Standardwert hinzu: -XX: SurvivorRatio = 8; der Ausgang ist:

PS Young Generation 
Eden Space: 
capacity = 573046784 (546.5MB) 
.... 
From Space: 
capacity = 71303168 (68.0MB) 
.... 
To Space: 
capacity = 71303168 (68.0MB) 

546,5/68 = 8.

Das gleiche gilt für -Xmn -, dass Sie setzen. Und das ist seltsam! Ich habe nicht den Wert von SurvivorRatio verändert - es immer noch die gleichen Standardwert ist 8.

Es dass intern scheint es einige Kontrollen, ob die Berechnung der SurvivorRatio bezogenen Flags gesetzt werden und verschiedene Richtlinien angewendet (Ich wünschte, ich wusste, dass die intrinsic von diesen, aber kein Glück).

Und Junge! habe ich versucht, diese zu finden. Ich fand etwas, das darauf hinweist, aber nicht direkt eine Antwort, wie this oder this (vor allem der Kommentar).Ich habe ein:

grep -R "SurvivorRatio" . 

innerhalb der hotspot Quellen vor Ort und immer noch keinen Hinweis in all den Ergebnissen, was los ist.


Die einzige logische Erklärung, die ich zu diesem Zeitpunkt haben, ist, dass es sei denn, angegeben jeder beliebige Parameter im Zusammenhang mit SurvivorRatio; ein Standardwert wird gewählt (das ist nicht unbedingt der von java -XX:+PrintFlagsFinal berichtete), aber etwas in der Mitte, etwas nah dran. Wenn dies der Fall ist, dann sollte eindeutig in der Dokumentation angegeben werden; Sonst ist das in meiner Welt ein kleiner Dokumentationsfehler.

+0

Ich habe den Quellcode zu diesem Problem gefunden. Ich denke, das kann hilfreich sein. [psYoungGen.cpp] (https://github.com/JetBrains/jdk8u_hotspot/blob/master/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp). Von Zeile 108 bis Zeile 144 –

Verwandte Themen