2011-09-28 12 views
7

Istnieje usługa samoobsługowa WCF, która musi działać 99% czasu. Czasami mamy jakieś kłopoty z pamięcią tak:Problemy z pamięcią sterty

memory leaks

Ale usługa działa jak zwykle po tym problemów. Jak możemy to zarządzać? Wszelkie wskazówki i wskazówki, jak zapewnić solidne usługi, które przetrwają w różnych sytuacjach wyjątkowych, są bardzo mile widziane.

+0

Czy masz czysty kod zarządzany, czy masz niezarządzanego kodu lub współdziałania? –

+0

Cały kod jest zarządzany. I używamy [dotConnect for Oracle z devArt] (http://www.devart.com/dotconnect/oracle/) jako biblioteki warstw danych. – kseen

+0

Dlaczego zaciemniłeś zrzut ASCII? Wiesz, że można go całkowicie zrekonstruować za pomocą kodów po lewej? – Dani

Odpowiedz

3

Nie jestem zbyt pewien, gdzie tkwi problem, ale wyciek pamięci może być przyczyną.

Cały kod jest zarządzany. I używamy dotConnect dla Oracle z devArt jako biblioteki warstw danych.

Zakłada się, że cały kod jest zarządzany, ale mogą istnieć niezarządzane części. Należy jednak wywołać metodę Dispose dla wszystkich przedmiotów jednorazowego użytku po ich użyciu, nie sądzę, że są one prawidłowo usuwane po wyjściu poza zakres. Najlepszą praktyką jest, aby obiekty jednorazowe nie wychodziły poza zakres bez wywoływania metody Dispose. Możesz używać instrukcji "using", jeśli używasz ich jako zmiennych lokalnych.

DbConnection jest dobrym przykładem dla przedmiotów jednorazowych, należy się pozbyć wszystkich połączeń (przedmiotów jednorazowego użytku).

+2

+1, Dobra rada, Oracle DAL wymagają Dispose, ponieważ użyli kodu niezarządzanego, a szkoda, ponieważ pozbywanie się połączeń i poleceń Oracle jest zwykle najbardziej czasochłonną operacją w aplikacja (IMHE) –

0

Jeśli jest to problem z WCF (nie jestem pewien, co zrobić z zrzutem), sugeruję aktywację śledzenia po stronie serwera WCF i zajrzyj do wyjątków, jeśli istnieją (i zmień swoje pytanie tak, aby możemy ci jeszcze pomóc).

Oto link, który wyjaśnia, jak to zrobić:

How to enable WCF tracing

0

Jakie są wasze serwisowe Zachowania szczególnie ConcurrencyMode i InstanceContextMode.

jeśli masz wiele jako tryb współbieżności i zestaw instancji do (PerCall lub PerSession (domyślnie)) możesz definitywnie napotkać problemy, jeśli masz duże DataStructures lub nieumiejętne zasoby.

jeśli używasz wielu współbieżności spróbować InstanceContextMode Pojedyncze [ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]

0

Czy jesteś 100% nikt z was zależności mieć niezarządzanego kodu? Widziałem coś bardzo podobnego do tego i działo się tak, ponieważ zwalnialiśmy pamięć, że inny proces również spróbuje później zwolnić.

Powiązane problemy