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?
Odpowiedz
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.
O, widzę ... A co z metodą SuppressFinalize()? Czy ma inny cel? – Alex
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.) –
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
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.
Nie można uruchomić pobierania , może "zasugerować". GC sam zdecyduje –
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.
Tymczasem jest to możliwe, istnieją metody w GC
class:
GC.TryStartNoGCRegion(...)
i GC.EndNoGCRegion()
.
- 1. Zbieranie i odbieranie śmieci
- 2. Zbieranie śmieci w dalvik vm
- 3. Zbieranie śmieci z Ruby/Rails
- 4. Jak profilować zbieranie śmieci w Ruby
- 5. Lua powiązania z C++ i zbieranie śmieci
- 6. Ile czasu należy poświęcić na zbieranie śmieci?
- 7. Jak wyłączyć zbieranie śmieci w GHC Haskell?
- 8. Czy można zatrzymać walker?
- 9. Kończy się zbieranie śmieci z zespołu przy pomocy Unicorn + Rack
- 10. Zbieranie śmieci z systemu Android dalvik może się zawiesić?
- 11. Pytanie o statyczne elementy wewnątrz klas niestatycznych i zbieranie śmieci
- 12. wolisz korzystania del lub realokacja None (zbieranie śmieci)
- 13. . Usuwanie śmieci .NET - na co wpływa?
- 14. Czy mogę wykryć moment, w którym proces zbierania śmieci uruchamiany jest w .NET?
- 15. Czy można zatrzymać wymianę pamięci na dysk?
- 16. Czy można zatrzymać automatyczne pobieranie obiektu ObjectDataSource?
- 17. Czy można zatrzymać żądanie "odczytu" kręgosłupa
- 18. Czy można zatrzymać wykonywanie w javascript/jquery?
- 19. Zbieranie danych aplikacji w języku Java (opcjonalnie .Net)
- 20. Czy można klonować strumień .NET?
- 21. Nie można zatrzymać drukowania
- 22. Ręczne usuwanie śmieci w Pythonie
- 23. Czy mogę zatrzymać .net 4.0 z kodowania pojedynczych cudzysłowów?
- 24. Czas zbierania śmieci Java?
- 25. Zamknięcie i zbieranie śmieci: najbardziej efektywny sposób na usunięcie kolejnych węzłów z połączonej listy
- 26. Jak prawidłowo zatrzymać wielowątkową usługę Windows .NET?
- 27. Uzyskiwanie nieoczekiwanego zadania Wyjątek w celu usunięcia aplikacji wcześniej niż zbieranie śmieci
- 28. Czy mogę wymuszać odbiór śmieci w Javie?
- 29. Kiedy w ExecutorService można pobierać działające śmieci obiektów?
- 30. Nie można zatrzymać odtwarzacza AVPlayer
Usuwanie śmieci nie jest częścią języka programowania C#. Jest częścią środowiska .NET CLR. –
"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()'. –
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