Garbage collector

0

Mam kilka pytań na temat GC i uwalniania pamieci.

  1. Czy wykonanie poniższego kodu rzeczywiście spowoduje bezwzględne uruchomienie GC? W Javie wiem, że nie da się uruchomić GC, tylko można zasugerować jego uruchomienie, a to jest kolosalna różnica.
System.GC.Collect(System.GC.MaxGeneration, System.GCCollectionMode.Forced);
  1. Czy praca GC powoduje wstrzymanie działania programu tak, jak ma to miejsce w Javie?

  2. Jeżeli klasa implementuje interfejs IDisposable, to musi posiadać metodę Dispose.
    Czy jeżeli stworzymy obiekt z wykorzystaniem "using" to po zakończeniu using obiekt istnieje, aż zmiecie go GC, czy jest usuwany od razu? Czy wtedy destruktor się też uruchomi, czy uruchomi się metoda Dispose?

  3. Czy jest możliwe wymuszenie uwolnienia pamięci zajmowanej przez obiekt podobnie, jak to robi "delete" w c++? Czy jedynym sposobem jest zgubienie referencji i uruchomienie GC?

3

Ad.1. Tak.
Ad.2. Czasem tak, czasem nie, czasem zatrzymuje wszystkie wątki, czasem działa w tle.
Ad.3. Czeka. Dispose powinno być tak zaimplementowane, by mogło się wykonać ręcznie (poprzez using i wyjście z bloku albo ręczne wywołanie) oraz z Finalizera. To w gruncie rzeczy normalna metoda.
Ad.4. Nie można wymusić zniszczenia obiektu ze sterty zarządzanej w twoim wymarzonym momencie. Np. obiekty z własnymi Finalizerami potrzebują dwóch "obiegów" GC, więc nawet w momencie wywołania GC.Collect nie możesz być pewny, że pamięć została zwolniona.

Natomiast mogę powiedzieć, że w przynajmniej połowie przypadków wymuszenie uruchomienia GC przez użytkownika jest niepotrzebne, a czasem szkodliwe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1