Mam pewne problemy z usługą WCF (niektóre zrzuty, wycieki pamięci itp.) I uruchamiam narzędzie profillng (ANTS Memory Profiles).Zwolnij pamięć ze słownika C# zawartego w obiekcie statycznym
Tylko po to, aby dowiedzieć się, że nawet po przetworzeniu (wykonuję konkretny test, a następnie zatrzymałem), Generacja 2 stanowi 25% pamięci dla usługi sieciowej. Wyszukałem tę pamięć, aby znaleźć, że mam obiekt słownikowy pełen (zero, zero) elementów, z -1-krotnym kodem.
Przepływ pracy usługi internetowej oznacza, że podczas określonego przetwarzania elementy są dodawane, a następnie usuwane ze słownika (tylko proste Add
i Remove
). Nic takiego. Wydaje się jednak, że po usunięciu wszystkich elementów słownik jest pełen (zerowy, zerowy) s. KeyValuePair
. Tysiące z nich tak naprawdę zajmują dużą część pamięci i ostatecznie dochodzi do przepełnienia, a odpowiednia wymuszona pula puli aplikacji i plik DW20.exe uzyskują wszystkie cykle procesora, jakie może uzyskać.
Słownik jest w rzeczywistości Dictionary<SomeKeyType, IEnumerable<KeyValuePair<SomeOtherKeyType, SomeCustomType>>>
(System.OutOfMemoryException because of Large Dictionary), więc już sprawdziłem, czy istnieje jakiś rodzaj odniesienia, który trzyma rzeczy.
Słownik jest zawarty w statycznym obiekcie (aby był dostępny dla różnych wątków przetwarzania poprzez przetwarzanie), więc z tego pytania i wielu innych (Do static members ever get garbage collected?) Rozumiem, dlaczego ten słownik znajduje się w Generacji 2. Ale jest to również przyczyną tych (null, null)? Nawet jeśli usuwam przedmioty ze słownika, coś będzie zawsze zajęte w pamięci?
To nie jest problem z szybkością, jak w tym pytaniu Deallocate memory from large data structures in C#. Wydaje się, że pamięć nigdy nie zostaje odzyskana.
Czy jest coś, co mogę zrobić, aby usunąć elementy ze słownika, a nie tylko wypełniać je (zerowymi, zerowymi) parami? Czy jest coś jeszcze, co muszę sprawdzić?
+ !: Za wykonanie odpowiednich badań i napisanie dobrego pytania. – Virtlink
'List <>' ma 'TrimExcess()' metoda, 'Słownik <,>' niestety nie ma. Myślałem, że to był łatwy wynik :) –
Czy wywołanie Dictionary.Clear() robi jakąkolwiek różnicę? – Alex