Pomoc w tuningu JVM

Pomoc w tuningu JVM
UN
  • Rejestracja:prawie 6 lat
  • Ostatnio:2 dni
  • Postów:36
0

Cześć
Bawie się trochę JVM i chciałbym osiągnąć taki rezultat (z g1 garbage collector):
Heap podzielony na Old i Young Generation po 512mb
Young generation podzielony na 3 części eden, 1 część S0 i 1 część S1 (czyli 307,2mb, i S0,S1 po 102,4mb)
Odpalam jvm z takimi parametrami (oczywiśćie bez gwiazdek):

Kopiuj
 -XX:+UseG1GC
* -Xms1024m   -Xmx1024m -Xmn512m
**  -XX:SurvivorRatio=3
*** -XX:NewSize=512m -XX:MaxNewSize=512m

i teraz ja to rozumiem tak:

Kopiuj
* cały rozmiar heap = 1024 (chyba Xmn jest zbędne bo niżej definiuje NewSize i MaxNewSize)
** powinno dać podzielenie young generation na 3/5 czyli eden ma 3 części, S0 i S1 po 1 czesci
*** rozmiar young generation

I teraz wydaje mi się że powinienem osiągnąć cel, ale nie wynika to z VisualVM. I teraz nie wiem czy źle zapisuje flagi dla JVM czy nie potrafie czytać VisualVM.
Heap ma poprawny rozmiar (drugie zdjęcie), ale na pierwszym zdjęciu przykładowo Eden space jest zapisany Eden Space (1,000G, 528,000M) (czyli 528mb z 1gb?). Czemu w takim razie Old Gen jest zapisany (1,000G, 486,000M) kiedy powinien mieć 512. Już nie mówiąc o Survivor 0 i Survivor 1 zapisane odpowiednio (8,8) i (1,000G, 8)

Dzięki za pomoc

screenshot-20220122205507.png
screenshot-20220122205551.png

edytowany 3x, ostatnio: Undersent
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 2 godziny
  • Postów:1880
6

Przeczytaj najpierw dokumentacje oraz https://www.oracle.com/technical-resources/articles/java/g1gc.html

Avoid explicitly setting young generation size with the -Xmn option or any or other related option such as -XX:NewRatio.
Fixing the size of the young generation overrides the target pause-time goal.

To, co chcesz zrobić działa na przekór algorytmowi, który sam optymalizuje się pod określony limit latency. Takie zabawy może i miały jakiś sens w starszy algorytmach.


”Engineering is easy. People are hard.” Bill Coughran
edytowany 3x, ostatnio: Charles_Ray
UN
Tak, zdaję sobie sprawę, że nie jest to zalecane, ale nie o to tu chodzi. To jest tylko ćwiczenie i chciałbym zobaczyć na diagramach to co sobie założyłem.
Charles_Ray
To zmień algorytm na ParallelGC albo CMS :)
UN
  • Rejestracja:prawie 6 lat
  • Ostatnio:2 dni
  • Postów:36
2

Rzeczywiście G1 nie do końca chce współpracować z moją konfiguracją. ParallelGC daje już poprawne wyniki.
Dziękuję za pomoc.
screenshot-20220122231025.png

SL
  • Rejestracja:około 7 lat
  • Ostatnio:około godziny
  • Postów:900
3

Przy G1 nie powinno się ustawiać rozmiarów ręcznie, bo z uwagi na design (wiele małych regionów) G1 może sprawić, że dany kawałek będzie pełnił różne funkcje w zależności od zapotrzebowania. Do tego dochodzi cała machineria związana z balansowaniem rozmiaru young genu w celu zmieszczenia się w ustalone limity czasowe. Jak bardzo chcesz wymusić rozmiar young gen to możesz popróbować z opcjami -XX:G1NewSizePercent i XX:G1MaxNewSizePercent

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.