poniedziałek, lipca 22, 2013

Samochód jako zmniejszacz temperatury.... GC i jak to możliwe, że Young Generation może być zbyt duże, strzeż się finalize() i muzyczka :-) Czyli potok świadomości....

Wpadlibyście na to, że samochód obniża gorączkę? ;-) Albo bardziej prawdziwie temperaturę ciała ;-)

Gdy wyjeżdżałem z domu miałem jakieś 37.6 stopnia Celsiusza, a gdy przejechałem do Krakowa miałem 36.7 stopnia Celsiusza ;-)
Fakt, to 37.6 było na godzinę przed wyjazdem, a 36.7 jakieś 30 minut po przyjechaniu, ale jednak najistotniejszym elementem mojej kuracji była jazda samochodem ;-) [do tego tak z 1.5 litra płynów i Ibuprom Zatoki].

Inna sprawa, jak się człowiek bawi GC w Java'ie (takim z generacjami) to jest tak mówione, że to iż Young Generation jest za małe poznajemy po tym, że chociaż minor collection na Young czyści tą generację, ale zmiana w zużyciu sterty nie jest wcale zbyt duża (znacznie mniejsza od zmian na młodej generacji).
To dość logiczne, bo chodzi o to, że przy zbyt małym Young większość obiektów nie zdąży zginąć a przez to zostaną promowane do Tenured/Old.

Ale mówi się też, że jak Young jest zbyt duże to się wszystko sypie i zamiast minor collections robią się major collections (te na Old).
I tu miałem kłopot ze zrozumieniem czemu tak się dzieje, chociaż widziałem takie zachowanie jak ustawiałem "odpowiednio" rozmiar Young.....
Dopiero później gdzieś doczytałem to co mi wyjaśniło czemu tak się dzieje ;-)
Po prostu w momencie gdy ma się wykonać minor collection JVM sprawdza czy na stercie jest miejsce na najbardziej pesymistyczny wypadek, czyli na sytuację gdy wszystko z Young trafi do Old.... Na stercie musi być więc w najgorszym przypadku tyle miejsca by wlazły tam wszystkie obiekty z Eden + jeden Survivor....
I to jest problem, bo jak się ustawi Young na połowę wielkości całej pamięci to nigdy nie będzie tak fajnie by było wolne miejsce i zawsze będzie major collection :-)

Btw. już o tym kiedyś pisałem, ale napiszę jeszcze raz. Strzeżcie się finalize(), szczególnie na obiektach których będzie dużo i ich intencją jest by krótko żyły.... bo macie niemal 100% gwarancję, że takie obiekty trafią zawsze do Old...  Bo JVM dla każdego z nich tworzy "owijacza" czy "trzymacza", który trzyma do nich referencję... co aż tak straszne nie jest, ale do tego obiektu referencję trzyma Finalizer.... a to sprawia problemy.

Co jeszcze?
Kawałek :-) wczoraj mi go Spotify znalazło (albo już przedwczoraj) i mi się strasznie spodobał :-)




Podobne postybeta
Odrobina miłości i serwery działają ;-)
Journaling
Referencje w Java'ie
Chumbawamba "Charlie" - wypijmy za Darwina :-)
Sztuczki tropiciela błędów, part 2 ;-)