Garbage Collector, część III–healthy GC

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.

One thought on “Garbage Collector, część III–healthy GC”

  1. Bardzo fajne trzy posty.
    Czekam na kolejne oraz przykłady wykorzystania tej wiedzy w konkretnej/przykładowej implementacji.

Leave a Reply

Your email address will not be published.