2010-06-19 14 views
5

Czy programista może programowo uruchamiać/zatrzymywać usuwanie pamięci w języku programowania C#? Na przykład do optymalizacji wydajności i tak dalej.Czy można zatrzymać zbieranie śmieci .NET?

+1

Usuwanie śmieci nie jest częścią języka programowania C#. Jest częścią środowiska .NET CLR. –

+0

"Kinda". Jeśli nigdy nie przydzielisz niczego, GC nigdy się nie zbierze. Wstępnie przydzielić wszystko, czego potrzebujesz, a następnie wywołać 'GC.Collect()'. –

+0

Może również przyjrzeć się tej odpowiedzi: http://stackoverflow.com/questions/6005865/prevent-net-garbage-collection-for-short-period-of-time/6005949#6005949 – Gamlor

Odpowiedz

6

Niezupełnie. Możesz podać wskazówki GC za pomocą metod takich jak GC.AddMemoryPressure lub GC.RemoveMemoryPressure, ale nie zatrzymuj tego wprost.

Ponadto, zbieranie śmieci nie jest tak intensywne w procesie. Programiści bardzo rzadko martwią się o to.

+0

O, widzę ... A co z metodą SuppressFinalize()? Czy ma inny cel? – Alex

+0

SuppressFinalize działa na poszczególnych obiektach. Zdecydowanie nie na całym GC. Od MSDN: Obiekty implementujące interfejs IDisposable mogą wywoływać tę metodę z metody IDisposable.Dispose, aby uniemożliwić wywoływaczowi wywoływanie Object.Finalize na obiekcie, który tego nie wymaga. (Zasadniczo jest to bardzo niewielkie ulepszenie wydajności.) –

+0

Nie widzę, jak by to było dodanie wskazówki, aby * zapobiec * zbieranie śmieci, per se; jeśli nazwiesz 'GC.AddMemoryPressure', to prawdopodobnie spowoduje to, że CLR wykona * więcej * kolekcji śmieci, ponieważ wskazuje, że pamięć dostępna dla CLR dla procesu (wirtualnego lub innego) jest mniejsza niż myśli. Jeden * mógł * wywoływać 'GC.RemoveMemoryPressure' bez odpowiadającego mu wywołania' GC.AddMemoryPressure', próbując oszukać CLR w myśleniu, że ma więcej pamięci niż robi, ale można by pomyśleć, że API jest odporne (jeden mógłby nadzieja) na takie rzeczy. – casperOne

3

Nie, nie ma. W najlepszym przypadku można samemu wyzwolić wyrzucanie śmieci, chociaż jest to uważane za bardzo złe, ponieważ może zakłócać wbudowane algorytmy planowania używane przez GC.

+0

Nie można uruchomić pobierania , może "zasugerować". GC sam zdecyduje –

4

Ogólnie rzecz biorąc nie. Większość osób uważa, że ​​przedwczesna optymalizacja powinna martwić się o zbieranie śmieci, chyba że zrobisz profilowanie i dowiesz się, że to naprawdę jest przyczyną słabej wydajności w Twojej aplikacji.

Jeśli interesuje Cię skrupulatność poprawiania GC pod względem wydajności (lub, co bardziej prawdopodobne, poprawiania aplikacji, aby poprawić jej wydajność w stosunku do GC), MSDN ma całkiem przyzwoity opis sposobów na to.

4

Tymczasem jest to możliwe, istnieją metody w GCclass:

GC.TryStartNoGCRegion(...) i GC.EndNoGCRegion().

Powiązane problemy