Tak, brzmi to przesadnie. Zmniejszenie kwoty GC byłoby prawdopodobnie najlepszym krokiem do zredukowania środowiska wykonawczego aplikacji (jeśli jest to twój cel).
Wysoki "% czasu w GC" jest zwykle spowodowany przez przydzielanie, a następnie wyrzucanie tysięcy lub milionów obiektów. Dobrym sposobem, aby dowiedzieć się, co się dzieje, jest użycie narzędzia do profilowania pamięci.
Firma Microsoft zapewnia bezpłatne CLR Profiler. Spowoduje to wyświetlenie każdej alokacji, ale spowoduje, że aplikacja będzie działać 10-60 razy wolniej. Być może trzeba będzie uruchomić go na mniej danych wejściowych, aby mógł on zakończyć analizę w rozsądnym czasie.
Doskonałym narzędziem komercyjnym jest .NET Memory Profiler SciTecha. Nakłada to znacznie mniej na środowisko wykonawcze i dostępny jest bezpłatny okres próbny. Wykonując wiele migawek podczas procesu, można dowiedzieć się, jaki typ obiektów jest często przydzielany (a następnie niszczony).
Po zidentyfikowaniu źródła przydziałów należy sprawdzić kod i dowiedzieć się, w jaki sposób można zmniejszyć te przydziały. Choć nie ma jednego uniwersalnego wszystkie odpowiedzi, niektóre rzeczy, jakie napotykają w przeszłości należą:
- String.split mogą tworzyć setki małych strun krótkotrwały. Jeśli robisz wiele manipulacji ciągami, możesz pomóc przetworzyć ciąg, przesuwając go po znaku.
- Tworzenie tablic lub list tysięcy małych klas (na przykład poniżej 24 bajtów) może być kosztowne; jeśli te klasy mogą być traktowane jako typy wartości, może (czasami) znacznie poprawić rzeczy, aby zmienić je na struktury.
- Tworzenie tysięcy małych tablic może znacznie zwiększyć wykorzystanie pamięci (ponieważ każda tablica ma niewielki narzut); czasami można je zastąpić jedną dużą tablicą i indeksować w podsekcję.
- Posiadanie wielu przedmiotów możliwych do sfinalizowania (szczególnie jeśli nie są one usuwane) może wywierać duży nacisk na pojemnik na śmieci; upewnij się, że prawidłowo wyrzucasz wszystkie obiekty IDisposable i zauważ, że twoje własne typy powinny (prawie) być w stanie (prawie) never have finalizers.
- Firma Microsoft opublikowała artykuł pod numerem Garbage Collection Guidelines w celu zwiększenia wydajności.
Czy to jest ASP.NET? –
Należy zwrócić uwagę, że ten licznik wydajności pokazuje ostatnią obserwowaną wartość, a nie średnią ciągłą. Jest aktualizowany tylko pod koniec każdego cyklu GC. – adrianbanks
Jest to samohostowana usługa WCF. –