W poprzednim poście przedstawiłem zasadę działania generacji w GC. Dowiedzieliśmy się, że zwalnianie zasobów z generacji 0 jest bardzo szybkie z kolei z GEN 2 wolne. Healthy GC to reguła określająca optymalny (zdrowy) stan GC:
gen0 : gen1 : gen2 => 100 : 10 : 1
W Internecie można również znaleźć nieco inne wartości ale ogólna zasada jest taka sama: GEN0 powinna zawierać dużo więcej obiektów niż GEN2. Jeśli obiekty nie są zwalniane, wtedy promowane są do generacji pierwszej i drugiej. Z poprzedniego posta pamiętamy, że GC.Collect na GEN2 może być BARDZO kosztowny. Jeśli architektura aplikacji przewiduje, że w GEN2 będzie porównywalnie dużo obiektów do GEN0, wtedy mamy bardzo poważny problem wydajnościowy.
Przykład skrajnie niedobrej proporcji:
GC0: 10000, GC1: 10000, GC2: 10000
Co powyższe liczby oznaczają? Prawdopodobnie obiekty nie są po prostu zwalnianie i przy kolejnych GC.Collect zostały wypromowane do następnych generacji. Gdy GC poświęca dużo czasu na GC.Collect (np. ciągle 5%) tzn., że nie mamy Healthy GC. W Healthy GC, kolekcja jest szybka i GC nie obciąża tak bardzo CPU.
Bardzo fajne trzy posty.
Czekam na kolejne oraz przykłady wykorzystania tej wiedzy w konkretnej/przykładowej implementacji.