Wrzucam trochę jako ciekawostka. 10 minutowe zapisy z ParallelGC, w komentarzu SerialGC. Właśnie nagrywa się NewParallelGC, za jakieś 10 minut dorzucę w komentarzu. Aplikacja: Dość mała aplikacja napisana w Swingu (okolice 2 kloc), która tworzy sporo nowych obiektów o którym czasie życia (1-2 minuty absolutny maks dla około 95% obiektów).
@Wyrewolwerowanyrewolwer: Dodaj też G1GC, ale tak to nic dziwnego, i tak nie jest źle, średnia pauza 1ms, największa 120ms, widziałem gorsze. Tak to jest jak ludzie wszędzie wpychają te swoje zasady #tylkoimmutable i nic nie tykać, a wydajność potrafi po tym nieźle oberwać ;/ A widziałem ludzi co tak gry tworzą.
@GotoFinal: Z G1GC działy się cyrki, ale tak, odpalę i nagram. Następny w kolejce jest CMS GC. Fakt, jest sporo immutable, ale duża część obiektów jest tworzona, testowana w działaniu i po chwili wyrzucana (ich czas życia zamknie się pewnie w okolicach 2s). Ot taki przypadek po prostu ( ͡°͜ʖ͡°) Wydaje mi się że już z nim nie będzie jakiejś widocznej różnicy, a co dopiero
@mccloud: @GotoFinal: Tutaj NewParallel GC. Domyślnie z tego co wiem to on się nie uruchamia w żadnym przypadku (na wieloprocesorowych powyżej 2GB ramu wskakuje stary, zwykły parallel, na słabszych - serial). Mówię oczywiście o maszynie/trybie klienckiej/klienckim. W trybie serwerowym jeżeli dobrze pamiętam - parallel domyślnie.
Odpala się go przez dodanie jako argument JVM polecenia -XX:+UseParNewGC
Jeszcze małe wyjaśnienie dlaczego sektory są "zamalowane". Jest to po prostu efekt wieeeelu linii ściśniętych aby zmieścił się na ekranie cały przedział czasowy. W rzeczywistości wykres pamięci wygląda mniej więcej tak (w powiększeniu, na dole widać jednostki czasu).
@GotoFinal: Wydaje mi się że da się to zrobić/pokombinować przy ustawieniach nagrywania (możesz sobie ustawić interwały co ile ma rejestrować i co), ale boję się że przy tak szczegółowych informacjach po prostu zabraknie mi miejsca na dysku (a mam tylko z 50GB wolnego :P). Już teraz i tak większość czasu JVM jaki poświęciło w wątkach to wait() na zadany okres żeby co tyle rejestrować statsy :D
@GotoFinal: @mccloud: Wołam do G1 Mówiłem - nie nadaje się (⌐͡■͜ʖ͡■)
A tak na serio - nadaje się, ale tak gdzieś do co najmniej 20x większych danych. Fajnie pokrywa się wykres użytej pamięci przez maszynę z momentami cyklu GC, dlatego wrzucam 3 screenshoty z kolejnymi opcjami zaznaczonymi.
@Wyrewolwerowanyrewolwer: a weź go po-torturuj czasem jednocześnie dając szansę, -XX:MaxGCPauseMillis=1 -XX:G1NewSizePercent=40 -XX:G1MaxNewSizePercent=80 No chyba że już ci się nie chce, jakoś wybaczę :P Jestem ciekawy czy da radę zmniejszyć wtedy maxa do np 10ms, bo pewnie 1 nie osiągnie.
@GotoFinal: Chce mi się, ale już nie dzisiaj (jest jeszcze do nagrania cms). Przede wszystkim będę chciał trochę wydłużyć ilość cykli w edenie i s0/s1 żeby te obiekty które są kasowane podczas majorgc/fullgc (fajnie to widać na wykresie od seriala i newparallela) miały szansę być wyrąbane będąc jeszcze w młodej generacji, a nie już w starej. Potem ewentualnie ustawić większy rozmiar sektora(tylko no to pokazuje że bez sensu jest używanie tutaj
10 minutowe zapisy z ParallelGC, w komentarzu SerialGC. Właśnie nagrywa się NewParallelGC, za jakieś 10 minut dorzucę w komentarzu.
Aplikacja: Dość mała aplikacja napisana w Swingu (okolice 2 kloc), która tworzy sporo nowych obiektów o którym czasie życia (1-2 minuty absolutny maks dla około 95% obiektów).
#java #jvm #garbagecollector #ciekawostki #programowanietrochetez
źródło: comment_Ab36hOv3GcM9jtRvHsp4IdgzLmWJPpHM.jpg
Pobierzźródło: comment_NAJQDm132Dlqm7QqTfz5yXzzBGMFBdVV.jpg
PobierzTak to jest jak ludzie wszędzie wpychają te swoje zasady #tylkoimmutable i nic nie tykać, a wydajność potrafi po tym nieźle oberwać ;/ A widziałem ludzi co tak gry tworzą.
Fakt, jest sporo immutable, ale duża część obiektów jest tworzona, testowana w działaniu i po chwili wyrzucana (ich czas życia zamknie się pewnie w okolicach 2s). Ot taki przypadek po prostu ( ͡° ͜ʖ ͡°)
Wydaje mi się że już z nim nie będzie jakiejś widocznej różnicy, a co dopiero
Domyślnie z tego co wiem to on się nie uruchamia w żadnym przypadku (na wieloprocesorowych powyżej 2GB ramu wskakuje stary, zwykły parallel, na słabszych - serial).
Mówię oczywiście o maszynie/trybie klienckiej/klienckim. W trybie serwerowym jeżeli dobrze pamiętam - parallel domyślnie.
Odpala się go przez dodanie jako argument JVM polecenia -XX:+UseParNewGC
źródło: comment_nfBT5t9FZACEFPXtbq8UQAViFSeiATAO.jpg
PobierzJest to po prostu efekt wieeeelu linii ściśniętych aby zmieścił się na ekranie cały przedział czasowy.
W rzeczywistości wykres pamięci wygląda mniej więcej tak (w powiększeniu, na dole widać jednostki czasu).
źródło: comment_I51xkgpvfJizBDQa17MHWIkwYGGMKjk9.jpg
PobierzJuż teraz i tak większość czasu JVM jaki poświęciło w wątkach to wait() na zadany okres żeby co tyle rejestrować statsy :D
Zapuściłem teraz G1, tylko miejcie
Mówiłem - nie nadaje się (⌐ ͡■ ͜ʖ ͡■)
A tak na serio - nadaje się, ale tak gdzieś do co najmniej 20x większych danych.
Fajnie pokrywa się wykres użytej pamięci przez maszynę z momentami cyklu GC, dlatego wrzucam 3 screenshoty z kolejnymi opcjami zaznaczonymi.
źródło: comment_1JGYyD1bM1f8TMvaGCYUMML55gnb2Ex3.jpg
Pobierzźródło: comment_0Fo6RkYFFCvuZjVi05TBmnrkqC3pAJ4A.jpg
Pobierzźródło: comment_BHFEl4RzLLZ5Ey3EeVT1c7Hho2L7B1hc.jpg
Pobierz-XX:MaxGCPauseMillis=1 -XX:G1NewSizePercent=40 -XX:G1MaxNewSizePercent=80
No chyba że już ci się nie chce, jakoś wybaczę :P
Jestem ciekawy czy da radę zmniejszyć wtedy maxa do np 10ms, bo pewnie 1 nie osiągnie.
Przede wszystkim będę chciał trochę wydłużyć ilość cykli w edenie i s0/s1 żeby te obiekty które są kasowane podczas majorgc/fullgc (fajnie to widać na wykresie od seriala i newparallela) miały szansę być wyrąbane będąc jeszcze w młodej generacji, a nie już w starej. Potem ewentualnie ustawić większy rozmiar sektora(tylko no to pokazuje że bez sensu jest używanie tutaj
(⌐ ͡■ ͜ʖ ͡■)
źródło: comment_dnATZcal8fx6sANmrxTLEooR8lssF439.jpg
PobierzNo, tablic też trochę. Ale małych, maksymalnie z 14x10 i 4x4 wymiary.
To tylko wskazówka dla JVM.
Ogólnie PODOBNO przy G1 i nowej javie to miało już dobrze działać.
Edit: No dobra, 1ms to JEST skrajny przypadek :D
Nic więcej.
Też wszystko immutable, albo prawie wszystko.
A, no i jakoś 24 wątki.