Odśmiecanie pamięci z kodu

0

Oczywiście wiem, że wywoływanie GC z kodu w zasadzie nigdy nie powinno mieć miejsca, a konieczność jego wywoływania to na 95% źle zaprojektowana aplikacja lub błędy w jej implementacji.

Krótkie i proste pytanie: Które z poniższych wywołań gwarantuje usunięcie WSZYSTKICH śmieci?

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.Collect(0, GCCollectionMode.Forced);
GC.Collect(2, GCCollectionMode.Forced);

Czy może jeszcze inne?

Nie chodzi o zagłębianie się w szczegóły działania sterty i GC, tylko o to, żeby poznać sposób na całkowite jej oczyszczenie (usunięcie wszystkich niedostępnych obiektów).

Wiem, że są 3 generacje obiektów i chodzi tu o to, jak zmieść obiekty wszystkich generacji, a nie tylko jednej.

3

Skuteczne kontrolowanie ilosci obiektow to nie ich tworzenie tylko posoadanie puli obiektow i fabryki co odnawia stare i ew tworzy nowe jak limit nie strzelil.

Pamietaj ze sa szczególne obiekty jak assembly czy parsery xml, które nigdy nie zistana zwolnione i szczegolnie tutaj trzeba stosowac cache/pule.

0
pieczarek napisał(a):

Skuteczne kontrolowanie ilosci obiektow to nie ich tworzenie tylko posoadanie puli obiektow i fabryki co odnawia stare i ew tworzy nowe jak limit nie strzelil.

Wiadomo, że stosowanie "dobrych praktyk" zapobiega większości problemów związanych z zarządzaniem pamięcią, jednak nie o to jest pytanie.

pieczarek napisał(a):

Pamietaj ze sa szczególne obiekty jak assembly czy parsery xml, które nigdy nie zistana zwolnione i szczegolnie tutaj trzeba stosowac cache/pule.

To są pewnie szczególne przypadki, ale jak obiekt ma w sobie zasoby systemowe, np. plik otwarty na wyłączność, otwarte połączenia sieciowe, w takiej klasie w destruktorze powinno być oddanie niezarządzanych zasobów.

Pytanie nie jest o dobre i złe praktyki ani o konsekwencje stosowanych złych praktyk. Pytanie jest o to, jak "ręcznie" (poprzez wywołanie odpowiedniej instrukcji w miejscu wskazanym przez programistę) uruchomić odśmiecach i żeby ten odśmiecacz zmiótł WSZYTKIE śmieci, a nie najstarsze czy najnowsze.

A że takie uruchamianie odśmiecacza z reguły nie powinno mieć miejsca, to już inny temat.

1

Nikt nie wie, a ja znalazłem sam

link
link

GC.Collect(2, GCCollectionMode.Forced);

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